所以Java 8引入了方法引用,文档描述了这四种类型.
我的问题是两种实例类型之间的区别是什么?
- 引用特定对象的实例方法.
- 引用特定类型的任意对象的实例方法.
两者都参考参考但有什么显着不同?用于解决它们的类型推断是不同的吗?重要的是(在他们的例子中)一个是闭包而另一个是lambda?它与方法的参数数量有关吗?
问题是关于java.util.stream.Stream.reduce(U identity,BiFunction<U, ? super T, U> accumulator, BinaryOperator<U> combiner)方法。
要求之一是组合器功能必须与累加器功能兼容。对于所有u和t,必须满足以下条件:
combiner.apply(u, accumulator.apply(identity, t)) == accumulator.apply(u, t) (*)
Run Code Online (Sandbox Code Playgroud)
如果combiner和accumulator相同,则上述相等性自动成立。
我的问题
有没有使用combiner和和减少流的示例accumulator?
更新
为了澄清一些事情:
BinaryOperator实际上是在扩展BiFunction,因此在需要BiFunction时可以使用它。如果U和T相同,则始终是合法的:
operator<T> op = (x,y) -> something;
stream.reduce(id, op, op);
Run Code Online (Sandbox Code Playgroud)
我从来没有说过我可以一直使用combineras,acumulator因为在一般情况下,它们用于不同的目的并且是不同的Java类型。
另外,我对平凡的示例不感兴趣,但对并行流进行归约时在实践中遇到的自然示例不感兴趣。
对于一些琐碎的示例,有很多教程,例如本教程
我为什么要问这个问题
基本上,存在这种简化方法的原因是针对并行流。在我看来,条件(*)如此之强,以至于在实践中,由于很少有还原操作可以实现此还原,因此它使还原无效。