Java8-Stream之数值流
在Stream里元素都是对象,那么,当我们操作一个数字流的时候就不得不考虑一个问题,拆箱和装箱。虽然自动拆箱不需要我们处理,但依旧有隐含的成本在里面。Java8引入了3个原始类型特化流接口来解决这个问题:IntStream,DoubleStream,LongStream, 分别将流中的元素特化为int、long、doub,从而避免了暗含的装箱成本。每个接口都带来了进行常用数值归约的新方法,比如求和sum,求最大值max。此外还有必要时再把他们转换回对象流的方法。这些特化的原因就是装箱造成的复杂性--类似int和Integer之间的效率差异。
将对象流映射为数值流
常用方法为mapToInt
, mapToDouble
, mapToLong
,这些方法和map相同,只是它们返回一个特化流,而不是Stream
@Test
public void testToInt() {
final ArrayList<Dish> dishes = Lists.newArrayList(
new Dish("pork", false, 800, Type.MEAT),
new Dish("beef", false, 700, Type.MEAT),
new Dish("chicken", false, 400, Type.MEAT),
new Dish("french fries", true, 530, Type.OTHER),
new Dish("rice", true, 350, Type.OTHER),
new Dish("season fruit", true, 120, Type.OTHER),
new Dish("pizza", true, 550, Type.OTHER),
new Dish("prawns", false, 300, Type.FISH),
new Dish("salmon", false, 450, Type.FISH)
);
IntStream intStream = dishes.stream()
.mapToInt(Dish::getCalories);
}
将数值流转回对象流
我们虽然会使用数值流进行计算,但经常需要回归到对象,那么就需要将int stream装箱为Integer stream. 可以使用boxed()方法。
Stream<Integer> boxed = intStream.boxed();
默认值OptinalInt
由于数值流经常会有默认值,比如默认为0。数值特化流的终端操作会返回一个OptinalXXX对象而不是数值。
OptionalInt optionalInt = dishes.stream()
.mapToInt(Dish::getCalories)
.max();
int max = optionalInt.orElse(1);
生成一个数值范围流
有时候需要生成一个数值范围,比如1到30. 可以使用for循环,也可以直接使用数值流。
创建一个包含两端的数值流,比如1到10,包含10:
IntStream intStream = IntStream.rangeClosed(1, 10);
创建一个不包含结尾的数值流,比如1到9:
IntStream range = IntStream.range(1, 9);
注
以上出自《Java8 In Action》
关注我的公众号

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了