public static void main(String[] args) throws IOException {
List<String> lst = new ArrayList<>();
lst.add("Alpha");
lst.add("Beta");
lst.add("Gamma");
String joinResult = lst.stream().peek(x->System.out.println(x)).map(x -> {
System.out.println("In the middle");return x+"3";}).peek(System.out::println).collect(Collectors.joining());
System.out.println(joinResult);
}
最后我没有使用collect(Collectors.joining()),而是使用了count()。但是没有打印任何内容。 那么count()不是终结操作吗? count 返回一个 long 值,所以应该是这样。真的很奇怪。
上面的代码从头到尾打印每个元素。 Alpha -> 中间 ->Alpha3 Beta -> 中间 -> Beta3 等等
这就是流的工作原理吗?每个元素都从头到尾处理过?
您的流源(
ArrayList
)具有已知的大小,中间操作(map()
和peek()
)不会影响该大小,因此count()
可以在不调用中间操作的情况下确定结果。
Stream.count()
的文档中明确提到:
API说明:
如果实现能够直接从流源计算计数,则可以选择不执行流管道(顺序或并行)。在这种情况下,不会遍历任何源元素,也不会评估任何中间操作。具有副作用的行为参数可能会受到影响,除非调试等无害情况,否则强烈建议不要这样做。例如,考虑以下流:
List<String> l = Arrays.asList("A", "B", "C", "D"); long count = l.stream().peek(System.out::println).count();
流源覆盖的元素数量
是已知的,中间操作 peek 不会注入流或从流中删除元素(可能是 flatMap 或过滤器操作的情况)。因此,计数就是List
的大小,不需要执行管道,并且作为副作用,打印出列表元素。List