List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Cherry");
list.add("Peach");
List<String> collect = list.stream()
.peek(x -> System.out.println(x))
.filter(x -> x.length()>4)
.peek(x -> System.out.println(x))
.collect(Collectors.toList());
这将打印:
Apple
Apple
Cherry
Cherry
Peach
Peach
所以我的结论是:
流的第一个输入将被处理,直到流结束。 只有这样,流的第二个输入才会被处理,并再次处理,直到流结束。
这与普通的方法调用完全不同。通常您会期望所有输入都将在一个方法调用中得到处理。如果你调用 peek() 我希望我会看到
Apple
Cherry
Peach
但事实并非如此。
因此,stream() 的实现将是它内部有一个 for 循环,并仅使用单个输入连续调用以下方法链。
最佳答案
您所看到的是 peek
所描述的方式。请参阅(强调我的):
Returns a stream consisting of the elements of this stream, additionally performing the provided action on each element as elements are consumed from the resulting stream.
因此,您注册的查看操作(或您的情况下的操作)将在元素被消耗时执行。
关于java - Java Streams的内部实现是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68669536/