Comparator為何是函數式接口?


Functional Interface

Java SE 8中重磅推出了lambda表達式,為了實現lambda進而又新增了函數式接口:對於只有一個抽象方法的接口,需要這種接口的對象時,就可以提供一個lambda表達式,這種接口稱為函數式接口(functional interface)

Java的函數式接口與函數式編程有着重要的聯系。函數式編程最大的特點就是函數(function)作為一等公民。所謂一等公民,說明了它在編程語言中的重要性。我們的傳統語言中大部分是將作為一等公民,而函數方法大多以API的方式去處理和傳遞值,類和結構體就像一個包裹,他們負責如何去組合值。函數式編程讓函數和值收到了平等對待。

Java最開始也是將值作為一等公民,但隨着函數式編程的流行以及它帶來的方便受人喜愛,Java在JDK1.8版本中推出了函數式編程的解決方法,函數式接口。Java作為一門高級語言,有着極高的安全性,但沒有C/C++這種底層語言所具有的靈活性,在C/C++中可以傳遞一個函數的引用地址,進而將函數地位提升,升級到一等公民的地位。但是在Java中沒有指針,所以Java中傳遞函數就變得困難。但是Java可以通過函數式接口的方式結合lambda表達式實現函數式編程。

Comparator為何是函數式接口?

介紹完了函數式接口,問題回來了,為何Comparator是函數式接口呢?來看Comparator的源碼。

@FunctionalInterface
public interface Comparator<T> {
	
	int compare(T o1, T o2);

	boolean equals(Object obj);

	default Comparator<T> reversed() {
        return Collections.reverseOrder(this);
    }

    public static <T> Comparator<T> nullsFirst(Comparator<? super T> comparator) {
        return new Comparators.NullComparator<>(true, comparator);
    }

    ....
    ....
    ....
}

可以看到,明明有好多方法呀!?再細看,equals是Object中的方法,這種對Object類的方法的重新聲明會讓方法不再是抽象的。(Java API中的一些接口會重新聲明Object方法來附加javadoc注釋。)更重要的是,JDK1.8中,接口可以聲明非抽象方法了,例如上面代碼中的default方法和static方法,且方法中可以有具體實現!!!這是JDK1.8的一個重要的變化。。記住。最后就只有一個抽象方法compare了,所以Comparator是符合函數式接口規范的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM