zoukankan      html  css  js  c++  java
  • 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);
    
    

    测试demo: https://github.com/Ryan-Miao/someTest/blob/master/src/main/java/com/test/java8/streams/NumStreamExample.java

    以上出自《Java8 In Action》

  • 相关阅读:
    loadrunner-3-19LR常见函数
    loadrunner-3-18Service-Level Agreement(服务水平协议)
    loadrunner-3-15IP欺骗
    loadrunner-3-14集合点
    Python 静态类型检查 mypy 示例
    JavaScript 中 == 和 === 的区别
    Python 一键安装全部依赖包
    TypeError: 'NoneType' object is not subscriptable
    前端开发神器 VSCode 使用总结
    Next.js 配置接口跨域代理转发
  • 原文地址:https://www.cnblogs.com/woshimrf/p/Java8-number-stream.html
Copyright © 2011-2022 走看看