当前位置:  开发笔记 > 编程语言 > 正文

为什么这个java Stream会运行两次?

如何解决《为什么这个javaStream会运行两次?》经验,为你挑选了1个好方法。

在Java的API 8说:

在执行管道的终端操作之前,不会开始遍历管道源.

那么为什么以下代码抛出:

java.lang.IllegalStateException:stream已经被操作或关闭

Stream stream = Stream.of(1,2,3);
stream.filter( x-> x>1 );
stream.filter( x-> x>2 ).forEach(System.out::print);

根据API的第一个过滤操作不应该在Stream上操作.



1> Tunaki..:

发生这种情况是因为您忽略了返回值filter.

Stream stream = Stream.of(1,2,3);
stream.filter( x-> x>1 ); // <-- ignoring the return value here
stream.filter( x-> x>2 ).forEach(System.out::print);

Stream.filter返回一个新的, Stream包含与给定谓词匹配的此流的元素.但重要的是要注意它是一个新流.当过滤器加入过滤器时,旧的操作已经进行.但新的不是.

引自StreamJavadoc:

应该仅对一个流进行操作(调用中间或终端流操作).

在这种情况下,filter是在旧Stream实例上运行的中间操作.

所以这段代码可以正常工作:

Stream stream = Stream.of(1,2,3);
stream = stream.filter( x-> x>1 ); // <-- NOT ignoring the return value here
stream.filter( x-> x>2 ).forEach(System.out::print);

正如Brian Goetz所说,你通常将这些调用链接在一起:

Stream.of(1,2,3).filter( x-> x>1 )
                .filter( x-> x>2 )
                .forEach(System.out::print);

推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有