繁体   English   中英

Java 8 - 懒惰评估?

[英]Java 8 - Lazy Evaluation?

当我发现自己对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循环无法获得的东西呢?

这是关键: 可组合性

arr.stream()
       .filter(Lazy::isGreater)
       .filter(Lazy::isEven)
       .map(Lazy::doubleIt)
       .findFirst();

这似乎是无害的,但现在这是一个价值:

 arr.stream()
       .filter(Lazy::isGreater)

您可以将其交给方法并在其上构建。

什么可以用等效的循环? 您可以在任何使用它的地方复制粘贴它。 它不是一个可组合的抽象。

此外,Stream还提供了如何迭代和处理数据摘要。 它可以使用工作池或fork连接,也可以按顺序执行CPU缓存本地或任何数量的事情。 你不再告诉JVM如何做一些你正在接近告诉它该做什么并让它弄清楚如何做的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM