因此,假设我在流上使用了一些随机过滤器,最直接的方法是直接输入谓词:
x.stream().filter(e -> e % 2 == 0)
同样,我可以简单地进行引用并预先定义谓词:
Predicate<Integer> isEven = e -> e % 2 == 0;
...
x.stream().filter(isEven)
但是我也可以使用一个函数:
private static boolean isEven(Integer integer) {
return integer % 2 == 0;
}
...
x.stream().filter(MyClass::isEven)
据我所知,谓词当然受到更多限制,而函数可能会有副作用等。但是由于诸如Venkat Subramaniam之类的人使用后一种解决方案,所以我真的很想知道:这里的主要区别是什么?
不!与方法引用相比,谓词并没有真正的限制!实际上,这些都是一样的!
只需看一下filter()
函数签名:filter(Predicate<? super T> predicate)
让我们考虑一下您的示例:
x.stream().filter(e -> e % 2 == 0)
Predicate<Integer> isEven = e -> e % 2 == 0;
...
x.stream().filter(isEven)
第一个只是后者的内联版本。
private static boolean isEven(Integer integer) {
return integer % 2 == 0;
}
...
x.stream().filter(MyClass::isEven)
在这里您可以看到Method References
实际情况。MR只是一个语法糖,使您可以基于现有功能定义Lambda表达式。
最终,所有这些表达式都成为谓词功能接口的相同实现。
另外,您还可以通过使用右侧的块语法在Lambda表达式中执行副作用,但是通常不建议这样做:
e -> {
//side effects here
return e % 2 == 0;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句