gpt4 book ai didi

java-8 - 使用 Predicate 或函数作为 Java 流过滤器有什么区别?

转载 作者:行者123 更新时间:2023-12-03 23:40:00 27 4
gpt4 key购买 nike

所以假设我在流上使用一些随机过滤器,最直接的方法是直接输入谓词:

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 表达式。

归根结底,所有这些表达式都成为 Predicate 功能接口(interface)的相同实现。

此外,您还可以使用右侧的 block 语法在 Lambda 表达式中执行副作用,但通常不建议这样做:
e -> {
//side effects here
return e % 2 == 0;
}

关于java-8 - 使用 Predicate 或函数作为 Java 流过滤器有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36798742/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com