stream 伪复用实现

如下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);

 

posted @ 2020-12-09 20:29  雪山上的蒲公英  阅读(473)  评论(0编辑  收藏  举报
/* 返回顶部代码 */