java - Java Streams的内部实现是什么

标签 java java-stream

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/

相关文章:

java - 如何在 Apache Spark 中执行简单的reduceByKey?

java - SectionsPagerAdapter mSectionsPagerAdapter;说 mSectionsPagerAdapter 无法解析为变量

java - 用户定义对象的 ArrayList 的 indexOf() 不起作用

Java forEach 无法使用 IntStream.range 在 flatMap 上工作

java - For 循环将自定义对象添加到 arraylist n 次 - Java8

java - 激活器错误

当客户端发送字符串时,Java websocket服务器接收到的不是纯文本

Java流不将List的所有值放入HashMap

java - 使用 Java 8 的流和收集器将 Collection to Map 转换封装到一个方法中

java - 将 Stream<Stream<T>> 转换为 List<T>