发生这种情况是因为您忽略了 的返回值。filter
Stream<Integer> 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
引用自 Stream
Javadoc:
流只能操作一次(调用中间或终端流操作)。
在本例中,是在旧 Stream 实例上运行的中间操作。filter
所以这段代码可以正常工作:
Stream<Integer> 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);