java8-Stream之数值流
在Stream里元素都是对象,那么,当我们操作一个数字流的时候就不得不考虑一个问题,拆箱和装箱。虽然自动拆箱不需要我们处理,但依旧有隐含的成本在里面。Java8引入了3个原始类型特化流接口来解决这个问题:IntStream,DoubleStream,LongStream, 分别将流中的元素特化为int、long、doub,从而避免了暗含的装箱成本。每个接口都带来了进行常用数值归约的新方法,比如求和sum,求最大值max。此外还有必要时再把他们转换回对象流的方法。这些特化的原因就是装箱造成的复杂性–类似int和Integer之间的效率差异。
将对象流映射为数值流
常用方法为mapToInt
, mapToDouble
, mapToLong
,这些方法和map相同,只是它们返回一个特化流,而不是Stream
1 |
|
将数值流转回对象流
我们虽然会使用数值流进行计算,但经常需要回归到对象,那么就需要将int stream装箱为Integer stream. 可以使用boxed()方法。
1 | Stream<Integer> boxed = intStream.boxed(); |
默认值OptinalInt
由于数值流经常会有默认值,比如默认为0。数值特化流的终端操作会返回一个OptinalXXX对象而不是数值。
1 | OptionalInt optionalInt = dishes.stream() |
生成一个数值范围流
有时候需要生成一个数值范围,比如1到30. 可以使用for循环,也可以直接使用数值流。
创建一个包含两端的数值流,比如1到10,包含10:
1 | IntStream intStream = IntStream.rangeClosed(1, 10); |
创建一个不包含结尾的数值流,比如1到9:
1 | IntStream range = IntStream.range(1, 9); |
注
以上出自《Java8 In Action》
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Ryan Miao的博客!
评论