简单结果终止方法
按照前面介绍的,终止方法里面像 count 、 max 、 min 、 findAny 、 findFirst 、anyMatch 、 allMatch 、 nonneMatch 等方法,均属于这里说的简单结果终止方法。所谓简 单,指的是其结果形式是数字、布尔值或者Optional对象值等。
publicvoidtestSimpleStopOptions() { List<String>ids=Arrays.asList("205", "10", "308", "49", "627","193", "111", "193"); // 统计stream操作后剩余的元素个数System.out.println(ids.stream().filter(s->s.length() >2).count()); // 判断是否有元素值等于205System.out.println(ids.stream().filter(s->s.length() >2) .anyMatch("205"::equals)); // findFirst操作ids.stream().filter(s->s.length() >2).findFirst() .ifPresent(s->System.out.println("findFirst:"+s)); }
执行后结果为:
6truefindFirst:205
避坑提醒
这里需要补充提醒下,一旦一个Stream被执行了终止操作之后,后续便不可以再读这个流执行 其他的操作了,否则会报错,看下面示例:
publicvoidtestHandleStreamAfterClosed() { List<String>ids=Arrays.asList("205", "10", "308", "49", "627", "193", "111", "193"); Stream<String>stream=ids.stream().filter(s->s.length() >2); // 统计stream操作后剩余的元素个数System.out.println(stream.count()); System.out.println("-----下面会报错-----"); // 判断是否有元素值等于205try { System.out.println(stream.anyMatch("205"::equals)); } catch (Exceptione) { e.printStackTrace(); } System.out.println("-----上面会报错-----"); }
执行的时候,结果如下:
-----下面会报错-----java.lang.IllegalStateException: streamhasalreadybeenoperateduponorclosedatjava.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:229) atjava.util.stream.ReferencePipeline.anyMatch(ReferencePipeline.java:449) atcom.veezean.skills.stream.StreamService.testHandleStreamAfterClosed(StreamService.java:153) atcom.veezean.skills.stream.StreamService.main(StreamService.java:176) -----上面会报错-----
因为stream已经被执行 count() 终止方法了,所以对stream再执行 anyMatch 方法的时候,就会报错 stream has already been operated upon or closed ,这一点在使用的时候需要特别注意。