• 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);
  • 相关阅读:
    java-ApiDemo
    java编译器特性
    java
    java
    java
    java
    java
    java
    hdoj 3549 Flow Problem(最大网络流)
    hdoj 1269 迷宫城堡(强连通分量)
  • 原文地址:https://www.cnblogs.com/zjfjava/p/14103346.html
Copyright © 2020-2023  润新知