相关文章:
在了解完流的常用方法后,我们接着来了解下数值流的常用方法
在 Java8 中,引入了三个数值流 (原始类型流特化),分别是:IntStream、LongStream、DoubleStream,它们会将流中的元素分别特化为 int、long、double,从而避免了暗含的装箱成本
-
映射到数值流
-
mapToInt()
- 将对象流映射为 int 数值流
-
mapToDouble()
- 将对象流映射为 double 数值流
-
mapToLong()
- 将对象流映射为 long 数值流
-
-
转换回对象流
-
boxed()
- 将原始流转换为一般流
-
一、IntStream
-
asDoubleStream()
-
将 int 数值流转换为 double 数值流
DoubleStream doubleStream = IntStream.rangeClosed(1, 5).asDoubleStream(); // [1.0, 2.0, 3.0, 4.0, 5.0] System.out.println(doubleStream.boxed().collect(toList()));
-
-
asLongStream()
-
将 int 数值流转换为 long 数值流
LongStream longStream = IntStream.rangeClosed(1, 5).asLongStream(); // [1, 2, 3, 4, 5] System.out.println(longStream.boxed().collect(toList()));
-
-
average()
-
计算平均值
OptionalDouble average = IntStream.rangeClosed(1, 5).average(); System.out.println(average.getAsDouble()); // 3.0
-
-
boxed()
-
将原始流转换为一般流
Stream<Integer> boxed = IntStream.rangeClosed(1, 5).boxed(); // [1, 2, 3, 4, 5] System.out.println(boxed.collect(toList()));
-
-
max()
-
筛选最大值
OptionalInt max = IntStream.rangeClosed(1, 5).max(); System.out.println(max.getAsInt()); // 5
-
-
min()
-
筛选最小值
OptionalInt min = IntStream.rangeClosed(1, 5).min(); System.out.println(max.getAsInt()); // 1
-
-
sum()
-
计算总和
int sum = IntStream.rangeClosed(1, 5).sum(); System.out.println(sum); // 15
-
-
summaryStatistics()
-
收集统计值:数量、总和、最大值、最小值、平均值
IntSummaryStatistics intSummaryStatistics = IntStream.rangeClosed(1, 5).summaryStatistics(); // IntSummaryStatistics{count=5, sum=15, min=1, average=3.000000, max=5} System.out.println(intSummaryStatistics);
-
-
range()
-
生成指定范围内的数值流,不包括结束值
IntStream.range(1, 5).forEach(System.out::print); // 1234
-
-
rangeClosed()
-
生成指定范围内的数值流,包括结束值
IntStream.rangeClosed(1, 5).forEach(System.out::print); // 12345
-
-
mapToObj()
-
将 int 数值流转换为一般流 (可以转换为其他类型)
List<String> mapToObj = IntStream.rangeClosed(1, 5) .mapToObj(i -> "java " + i).collect(toList()); // [Java 1, Java 2, Java 3, Java 4, Java 5] System.out.println(mapToObj);
-
-
剩余方法与 Stream 类中的方法用法相似,这里就不再赘述了
二、LongStream
- LongStream 用法与 IntStream 用法类似
三、DoubleStream
-
DoubleStream 没有
range()
和rangeClosed()
两个方法,不过可以使用其自带的 generate() 方法或者由 IntStream、LongStream 的asDoubleStream()
方法转换得到 -
generate()
-
返回一个无限 double 数值流,接收一个供给函数作为参数,来提供新值,需要截断
// 0.1319310689804356 // 0.7952486378454415 // 0.5488155029510984 // 0.6967469672576381 // 0.1200152480660096 DoubleStream.generate(Math::random).limit(5).forEach(System.out::println);
-