java.util.stream.DoubleStream

本文介绍了Java 8中的DoubleStream流,展示了如何使用其提供的各种聚合方法,如sum、sorted、average和max,并探讨了在计算过程中出现的精度问题,通过BigDecimal解决示例。
摘要由CSDN通过智能技术生成

java.util.stream.DoubleStream

Java 8 中的 IntStreamLongStreamDoubleStream 分别表示原始 int 流、 原始 long 流 和 原始 double 流。

  • 这三个原始流类提供了大量的方法用于操作流中的数据,同时提供了相应的静态方法来初始化它们自己。
  • 这三个原始流类都在 java.util.stream 命名空间下。
  • 不同的是针对不同类型的值做出的操作

java.util.stream.DoubleStreamDemo是一个原始长整型值序列 ( sequence ) 。该流提供了许多方法可以对该流中的元素顺序执行或并行执行一些聚合操作。其实,它的使用方式和 IntStream 一样,因为提供的方法也一样,除此之外,还额外提供了几个聚合方法

聚合方法

方法说明
rangeClosed(a,b)返回子序列 [a,b],包含起始值,增长步值为 1
range(a,b)返回子序列 [a,b),左闭右开,意味着不包括 b
sum计算所有元素的总和
sorted排序元素
average计算平均值
max查找最大值

DoubleStreamDemo代码

@Test
public void DoubleStreamDemo(){
    System.out.println("--Using DoubleStream.of--");
    DoubleStream.of(5.33,2.34,5.32,2.31,3.51).map(d->d*1.5).forEach(s->System.out.print(s +"\t"));
    System.out.println("\n\n--Using DoubleStream.average--");
    double val = DoubleStream.of(12.1,11.2,13.3).average().getAsDouble();
    System.out.println(val);
    System.out.println("\n--Using DoubleStream.max--");
    val = DoubleStream.of(12.1,11.2,13.3).max().getAsDouble();
    System.out.println(val);
    System.out.println("\n--Using DoubleStream.filter--");
    DoublePredicate range = d -> d > 12.11 && d < 12.99;
    DoubleStream.of(12.1,11.2,12.3).filter(range).forEach(d->System.out.print(d));
}

DoubleStreamDemo结果

--Using DoubleStream.of--
7.995	3.51	7.98	3.465	5.265	

--Using DoubleStream.average--
12.200000000000001  ----------------存在错误?!!

--Using DoubleStream.max--
13.3

--Using DoubleStream.filter--
12.3

结果解析:

  • 经过打印结果我们发现,结果中出现了精度问题

    • BigDecimal来解决精度问题

      //使用BigDecimal
      @Test
      public void DoubleTest() {
          double testDoubleVal = 1.23456789;
          BigDecimal bigDecimal = new BigDecimal(testDoubleVal);
          System.out.println(bigDecimal.setScale(3, BigDecimal.ROUND_HALF_UP));
          System.out.println(bigDecimal.setScale(4, BigDecimal.ROUND_HALF_UP));//不同的舍入规则
          System.out.println(bigDecimal.setScale(4, BigDecimal.ROUND_DOWN));  //不同的舍入规则
      }
      /*
      运算结果:
      	1.235
          1.2346
          1.2345
      */
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值