当我发现自己对Streams API如何对循环方法的必要性进行懒惰评估时,我正在浏览Streams Video。
这是典型的for循环代码,用于检查第一个大于3的数字,然后只需打印并返回。
List<Integer> arr = Arrays.asList(1, 2, 3, 5, 4, 6, 7, 8, 9);
for (int i : arr) {
System.out.println(" Checking if is Greater: " + i);
if (i > 3) {
System.out.println("checking if is Even " + i);
if (i % 2 == 0) {
System.out.println(i * 2);
break;
}
}
}
这是预期的输出:
Checking if is Greater: 1
Checking if is Greater: 2
Checking if is Greater: 3
Checking if is Greater: 5
Checking if is Even 5
Checking if is Greater: 4
Checking if is Even 4
8
现在使用Streams API的代码相同:
arr.stream()
.filter(Lazy::isGreater)
.filter(Lazy::isEven)
.map(Lazy::doubleIt)
.findFirst();
它也以同样的方式评估。那么filter()
如何提供一些我们用传统的for循环无法获得的东西?
答案 0 :(得分:3)
以下是关键:可组合性
arr.stream()
.filter(Lazy::isGreater)
.filter(Lazy::isEven)
.map(Lazy::doubleIt)
.findFirst();
这似乎是无害的,但现在这是一个价值:
arr.stream()
.filter(Lazy::isGreater)
您可以将其交给方法并在其上构建。
使用等效的for循环可以做什么?您可以在任何使用它的地方复制粘贴它。它不是一个可组合的抽象。
此外,Stream还使如何迭代和处理数据摘要。它可以使用工作池或fork连接,也可以按顺序执行CPU缓存本地或任何数量的事情。你不再告诉JVM如何做一些你正在接近告诉它该做什么并让它弄清楚如何做的事情。