2017-06-02 160 views
2

我試圖找出如何工作的。
我打算列出我認爲正在發生的事情,希望有人能告訴我我在地方是錯的。或者告訴我這是怎麼工作的。lambda表達式都被轉換爲BiConsumer

public BiConsumer<List<T>, T> accumulator() { 
    return List::add; 
} 
  1. 的方法稱爲蓄能器接受什麼並返回一個BiConsumer方法。
  2. accumulator返回參考add方法上的List作爲BiConsumer
  3. 上的List實際add方法實際上是一個Function<T, Boolean>的上下文中,發生在T,並返回一個布爾

這是我進入猜測領域的地方。

  • 它調用add方法,對List那就是BiConsumer的第一個參數的實例。
  • 我知道內部必須做的事情。

    public BiConsumer<List<T>, T> accumulator() { 
        return (list, item) -> list.add(i); 
    } 
    

    我明白,它可以忽略add方法的返回類型,所以它可以假裝Function<A, B>Consumer<A>

    但我就是不明白魔法,輪流一個BiConsumer運行ConsumerFunctionBiConsumer的第一個參數的實例。

    回答

    1

    這不是黑魔法。這是明確的here

    下面是特定類型的任意對象的實例方法的引用的示例:

    String[] stringArray = { "Barbara", "James", "Mary", "John", 
        "Patricia", "Robert", "Michael", "Linda" }; 
    Arrays.sort(stringArray, String::compareToIgnoreCase); 
    

    的方法參考String::compareToIgnoreCase等效lambda表達式將有正式的參數列表(String a, String b) ,其中a和b是用於更好地描述此示例的任意名稱。方法引用將調用方法a.compareToIgnoreCase(b)

    當你有類似SomeType::instanceMethod的東西時,它可以轉換爲接受兩個參數的函數,第一個參數是調用該方法的實例。它只是可以,因爲語言規範是這樣說的。

    +0

    所以'Function'方法可以變成'BiFunctions'以及'BiConsumers'。很高興知道。 – WORMSS

    +0

    @WORMSS如果你認爲我的答案回答你的問題,請考慮接受它! – Sweeper

    +0

    好吧,你的答案是'因爲語言規範說so.' ..不是最大的。您的答案告訴我的東西,我不知道,但不完全是最好的答案。所以我會等待,看是否有人能除此之外。 – WORMSS