本章内容
1、筛选、切片
2、映射
3、查找、匹配
4、归约
5、数值流
6、构建流
7、小结
5.5 数值流
我们在前面看到了可以使用reduce方法计算流中的元素的总和。
例如:
int calories = menu.stream()
.map(Dish::getCalories)
.reduce(0, Integer::sum);
这段代码的问题是,它有一个暗含的装箱成本。每个Integer都必须拆箱成一个原始类型,在进行求和。要是可以直接向下面这样调用sum方法,岂不是更好?
int calories = menu.stream()
.map(Dish::getCalories)
.sum();
但这是不可能的,问题在于map方法会生成一个Stream<T>。虽然六种的元素是Integer类型,但Stream接口没有定义sum方法。为什么没有呢?比如说。你只有一个像menu那样的Stream<Dish>,把各种菜加起来是没有任何意义的。但不要担心,StreamAPI还提供了原始类型流化,专门支持处理数值流的方法。
5.5.1 原始类型流化
Java8引入了三个原始类型特化流接口来解决这个问题:IntStream、DoubleSream和LongStream,分别将流中的元素特化为int,long和double,从而避免了暗含的装箱成本。每个接口都到来了进行常用数值归约的新方法,比如对数值流求和的sum,找到最大元素的max。此外还有在必要时把它们转回对象流的方法。要记住的是,这些特化的原因并在于流的复杂性,而是装箱造成的复杂性—即类似int和Integer之间的效率差异。
1、映射到数值流
将流转换为特化版本的常用方法是mapToInt、MapToLong和MapToDouble。这些方法和前面说的map方法的工作方式一样,只是他们返回的是一个特化流,而不是Str