在Java8之规约那篇文章中我们用到了数值的计算:Integer sum = numbers.stream().reduce(0, (a, b) -> a + b);
,这段代码的问题是,它有一个暗含的装箱成本。每个Integer都必须拆箱成一个原始类型,在进行求和。所以Stream API提供了原始类型流特化,专门支持处理数值流的方法。
- 映射到数值流:将流转换为特化版本的常用方法有mapToInt(操作int)、mapToDouble(操作double)、mapToLong(操作long)
//求和
log.debug("求和 {}",peoples.stream().mapToInt(People::getAge).sum());
//最大值,没有数据时可通过max.orElse(0)给定默认值
OptionalInt max = peoples.stream().mapToInt(People::getAge).max();
log.debug("最大值 {}",max.getAsInt());
//最小值,与最大值操作一致
log.debug("最小值 {}",peoples.stream().mapToInt(People::getAge).min().getAsInt());
//平均值
log.debug("平均值 {}",peoples.stream().mapToInt(People::getAge).average().getAsDouble());
- 转换回对象流
Stream<Integer> stream = peoples.stream().mapToInt(People::getAge).boxed();
- 数值范围:IntStream和LongStream有静态方法range(int startInclusive, int endInclusive)和rangeClosed(int startInclusive,int endInclusive),接收开始和结束值两个参数,区别在于range方法不包括结束值,而rangeClosed包括结束值
//输出1到10所有整数
IntStream.range(1, 11).boxed().forEach(integer -> log.debug(String.valueOf(integer)));
//输出1到10所有整数
IntStream.rangeClosed(1, 10).boxed().forEach(integer -> log.debug(String.valueOf(integer)));