首页 >Java >java教程 >为什么Java Stream的`filter()`在`flatMap()`之后有时会失去惰性?

为什么Java Stream的`filter()`在`flatMap()`之后有时会失去惰性?

Patricia Arquette
Patricia Arquette原创
2024-12-28 12:52:13565浏览

Why Does Java Stream's `filter()` After `flatMap()` Sometimes Lose Laziness?

FlatMap 之后的 Java 流过滤器并非完全惰性

Java 流提供了一种通过一系列转换来处理数据管道的方法。中间操作通常是惰性的,这意味着它们在调用终端操作之前不会执行。然而,据观察,在某些情况下,在 flatMap() 之后应用 filter() 可能会导致非惰性行为。

示例代码

考虑以下内容code:

System.out.println(
        "Result: " +
                Stream.of(1, 2, 3)
                        .filter(i -> {
                            System.out.println(i);
                            return true;
                        })
                        .findFirst()
                        .get()
);
System.out.println("-----------");
System.out.println(
        "Result: " +
                Stream.of(1, 2, 3)
                        .flatMap(i -> Stream.of(i - 1, i, i + 1))
                        .flatMap(i -> Stream.of(i - 1, i, i + 1))
                        .filter(i -> {
                            System.out.println(i);
                            return true;
                        })
                        .findFirst()
                        .get()
);

输出

1
Result: 1
-----------
-1
0
1
0
1
2
1
2
3
Result: -1

解释

第一种情况,应用过滤操作在 flatMap() 之前,导致惰性求值。评估在第一个匹配元素 (1) 处停止。

在第二种情况下,flatMap() 操作创建一个包含九个元素 (-1, 0, 1, 0, 1, 2, 1) 的新流、2、3)。随后的 filter() 操作将应用于每个元素,从而产生非惰性行为。尽管找到了匹配元素 (-1),评估仍会继续处理流中的所有元素。

修复

此问题已在 JDK-8075939 中得到解决并在 Java 10 中修复。它被向后移植到 Java 8 JDK-8225328.

该修复确保在存在 flatMap() 和 filter() 操作的情况下保持惰性计算。这意味着一旦找到匹配元素,评估就会立即终止。

影响

此修复解决了以下情况下非惰性行为可能引起的问题:使用 flatMap() 和 filter()。在需要提前终止的情况下,它提高了流管道的性能和正确性。

以上是为什么Java Stream的`filter()`在`flatMap()`之后有时会失去惰性?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn