Java8-Stream之数值流

简介: 在Stream里元素都是对象,那么,当我们操作一个数字流的时候就不得不考虑一个问题,拆箱和装箱。虽然自动拆箱不需要我们处理,但依旧有隐含的成本在里面。Java8引入了3个原始类型特化流接口来解决这个问题:IntStream,DoubleStream,LongStream, 分别将流中的元素特化为int、long、doub,从而避免了暗含的装箱成本。

在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》

    关注我的公众号

img_acfe50023e4718b33064273d65e4cd67.jpe
唯有不断学习方能改变! -- Ryan Miao
目录
相关文章
|
7月前
|
存储 Java
Java不可变集合与Stream流
Java不可变集合与Stream流
39 0
|
4月前
|
存储 Java
Java之stream流的详细解析一
2.Stream流 2.1体验Stream流【理解】 案例需求 按照下面的要求完成集合的创建和遍历 创建一个集合,存储多个字符串元素 把集合中所有以"张"开头的元素存储到一个新的集合
30 0
|
5月前
|
Java
java8的stream流
java8的stream流
30 0
|
7月前
|
缓存 安全 Java
Java Stream 流详解
Java Stream(流)是Java 8引入的一个强大的新特性,用于处理集合数据。它提供了一种更简洁、更灵活的方式来操作数据,可以大大提高代码的可读性和可维护性。本文将详细介绍Java Stream流的概念、用法和一些常见操作。
196 0
|
9月前
|
Java 大数据 数据处理
java的stream流
java的stream流
58 0
|
9月前
|
Java API 数据处理
Java中的Stream流中的常用方法
Stream API是Java 8中引入的用于处理集合数据的强大工具,提供了丰富的方法来进行过滤、映射、排序、聚合等操作。
76 0
|
9月前
|
安全 Java
Java Stream流详解
Java Stream流详解
|
9月前
|
SQL Java 数据处理
java的Stream流
Java 8 引入的 Stream 流是一个非常强大且有用的概念,它提供了一种函数式编程的方式来处理集合数据。Stream 可以让我们以更简洁、更可读的方式进行数据处理和操作,极大地提高了代码的表达力和开发效率。本文将详细介绍 Java 的 Stream 流,包括其概念、特点和常用的操作方法等。
59 0
|
10月前
|
Java API
Java Stream流详解(上)
Java Stream流详解(上)
119 0
|
10月前
|
SQL 分布式计算 Java
Java Stream流详解(下)
Java Stream流详解(下)