Java8专题五(下)《使用流》

本章内容

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值