lambda表达式都被转换为BiConsumer
问题描述:
我试图找出如何工作的。
我打算列出我认为正在发生的事情,希望有人能告诉我我在地方是错的。或者告诉我这是怎么工作的。lambda表达式都被转换为BiConsumer
public BiConsumer<List<T>, T> accumulator() {
return List::add;
}
- 的方法称为蓄能器接受什么并返回一个BiConsumer方法。
-
accumulator
返回参考到add
方法上的List
作为BiConsumer
- 上的
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
运行Consumer
或Function
在BiConsumer
的第一个参数的实例。
答
这不是黑魔法。这是明确的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
的东西时,它可以转换为接受两个参数的函数,第一个参数是调用该方法的实例。它只是可以,因为语言规范是这样说的。
所以'Function'方法可以变成'BiFunctions'以及'BiConsumers'。很高兴知道。 – WORMSS
@WORMSS如果你认为我的答案回答你的问题,请考虑接受它! – Sweeper
好吧,你的答案是'因为语言规范说so.' ..不是最大的。您的答案告诉我的东西,我不知道,但不完全是最好的答案。所以我会等待,看是否有人能除此之外。 – WORMSS