Java 8引入了三个原始类型特化流:IntStream,DoubleStream,LongStream。引入这些流是为了避免Stream频繁装箱拆箱所来的复杂性,也是为这些基本类型的流的操作带来了很大便利性,例如求和,最大值,最小值,简化归约操作。
1.映射到数值流
将流转为特定版本的常用方法mapToInt,mapToDouble和mapToLong,它们返回的是一个特化流,而不是Stream<T>。例如,我们像下面这样对一个菜单集合menu求所有Dish的卡路里和。
int calories = menu.stream()
.mapToInt(Dish::getCalories)
.sum();
这里,mapToInt会从每道菜中提取热量(用Integer表示),并返回一个IntStream,然后就可以调用IntStream接口中定义的sum方法,对卡路里求和。如果流是空,sum默认返回时0。
2.转换回对象流
同样一旦有了数值流,可能还想把它转化为非特化流。例如,IntStream上操作只能产生原始整数:IntStream的map操作接受的Lambda必须int并返回int(一个IntUnaryOperator)。但是可能想要生成另一类,比如Dish,因此需要访问Stream接口中定义的那些更广泛的操作。
IntStream intStream = menu.stream().mapToInt(Dish::getCalories);
Stream<Integer> stream = intStream.