2017-06-02 59 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