【发布时间】:2022-11-30 20:56:23
【问题描述】:
我尝试学习不同流 API 方法的工作逻辑,我对我的简短示例有一个疑问:
public static void main(String[] args) {
List<Integer> list = List.of(1,2,3,4,5,6,7,8,9);
list.stream()
.peek(i -> System.out.println(i))
.filter(i -> i>4)
.peek(i -> System.out.println(i))
.findAny();
}
我得到以下输出:1 2 3 4 5 5。但是如果我删除第一个 peek(),我只有 5 个。为什么我没有再次获得值列表?我无法从官方文档中获得通用逻辑,该文档具有“返回由该流的元素组成的流,被截断为长度不超过 maxSize。”
你能解释一下在这个例子中使用两种方法 peek() 的区别吗?
【问题讨论】:
-
Why am I not getting the list of values again?- 因为第二个peek()在filter()之后。只有通过filter()的元素才会被打印。因为流是懒惰的,即每个操作仅在需要时发生。这是 Streams(和 Java 8 函数)的关键特性。您可以在 API Documentation 中找到此信息 -
好的,知道了谢谢!但是,如果它在过滤器之前,为什么我在第一个 peek() 中只得到 [1,5]?
-
第一个
peek()消耗管道处理的所有元素,第二个只能消耗5,因为filter()不允许其他元素通过。不要混淆 Streams 和循环,它们的行为不同的.我在答案中给出了更详尽的解释。
标签: java list java-stream