2017-05-28 35 views
1

最近我正在學習Java 8的特性,所以我開始使用lambda表達式,然後我遇到了Java流API,現在我正在試圖圍繞流API中的方法,它們是如何工作的?流接口在java中如何工作?

我對lambda表達式的理解是,如果我們想要將lambda表達式傳遞給該方法,那麼我們需要創建一個與未實現的單一方法(Java 8接口可以有默認實現)匹配的lambda表達式表達。那麼傳遞lambda表達式的方法可以通過調用接口方法來執行lambda表達式。所以我可以說lambda表達式作爲接口方法的實現工作。

但是當我看到流API它有一些方法,其改變流,例如下面的代碼,只要篩選哪些是小於5

import java.util.Arrays; 
import java.util.List; 


public class StreamDemo { 
    static List<Integer> list= Arrays.asList(new Integer(1), new Integer(2), new Integer(3), new Integer(4), new Integer(5), new Integer(6)); 
    public static void main(String[] ar) { 
     list.parallelStream() 
       .filter(x-> x<5) 
       .forEach(System.out::print); 
    } 
} 

整數打印整數,但我不理解,怎麼過濾器因爲它沒有實現,因此我嘗試從Intellij中看到實現,它將我帶到Stream接口,其中filter是未實現的方法,它採用參數Predicate引用,但沒有方法調用謂詞方法boolean test(T t); Java如何評估結果,同樣有方法distinct沒有實現但仍給我準確的結果。

在此先感謝。

+4

'filter'確實有一個實現,在這種情況下,它是由'parallelStream()'返回的'Stream'實例提供的。您可以通過單擊定義旁邊的小綠色向下箭頭找到所有接口方法的實現。 –

+0

感謝您的快速提示,但我無法導航到不同的方法定義 – Akshay

+1

@AkshayNaik你不需要知道哪個類實現了這個方法,以及它是如何實現的。所有你需要知道的是一個Stream,無論它的具體實現是什麼,都有一個獨特的()方法,這個方法在Stream接口的javadoc中有記錄。 –

回答

4

Stream只是一個接口,如List。在運行時,Java選擇執行該任務的實現。 如果您想知道如何實施過濾方法,您可以在java.util.stream.ReferencePipeline#filter中找到示例。

我希望這能回答你的問題。

+0

感謝您的準確答案,但它仍然留下了兩個問題。 1.如何通過ReferencePipeline實現流而不向下調用過濾器方法2. ReferencePipeline沒有實現不同的方法 – Akshay

+0

好了,現在清楚了,流方法給出了ReferencePipeline的對象,並且由於方法是流接口不需要downcast對象。 謝謝@ jdebon – Akshay