java.util.stream.DoubleStream
Java 8 中的
IntStream
、LongStream
和DoubleStream
分别表示原始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 */
-