如下Demo,想要通过复用stream来实现多次统计,代码中是存在缺陷的
Stream<Person> personStream = personList.stream().filter(p -> "aa".equals(p.getName())); //年龄总和 Integer ageSum = personStream.collect(Collectors.summingInt(Person::getAge)); //现金最大值 BigDecimal maxMoney = personStream.map(Person::getMoney).reduce(BigDecimal.ZERO,BigDecimal::max);
在JAVA 8的Stream方法中,分为两大类,一类是惰性求值,另一类是立刻求值,只要Stream调用了立刻求值,Stream就会自动关闭,如果再次调用,将会提示如下错误:
java.lang.IllegalStateException: stream has already been operated upon or closed
at java.util.stream.AbstractPipeline.<init>(AbstractPipeline.java:203)
at java.util.stream.ReferencePipeline.<init>(ReferencePipeline.java:94)
Demo中的代码,stream 的过滤是固定的,如果想要简化代码,不要每次都显式的使用Collection#stream来创建一个新的流,可以使用 Supplier来解决,不过不要错误的认为stream是复用的,代码中每次get()都将返回一个新的stream。
Supplier<Stream<Person>> personStream = () -> personList.stream().filter(p -> "aa".equals(p.getName())); //年龄总和 Integer ageSum = personStream.get().collect(Collectors.summingInt(Person::getAge)); //现金最大值 BigDecimal maxMoney = personStream.get().map(Person::getMoney).reduce(BigDecimal.ZERO,BigDecimal::max);