zoukankan      html  css  js  c++  java
  • 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);
  • 相关阅读:
    flutter开发环境的搭建
    创建一个android项目
    android studio 安装与配置
    sentinel-dashboard.jar 安装
    三:nacos的配置中心
    二:nacos 的服务注册
    spring boot 在windows下的 批文件部署
    一:nacos 的安装与启动方式
    mysql 命令行安装方式
    Git 出现 Permission denied 时,重新生成ssh密钥
  • 原文地址:https://www.cnblogs.com/zjfjava/p/14103346.html
Copyright © 2011-2022 走看看