java8-Stream之数值流

Posted Ryan Miao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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》

以上是关于java8-Stream之数值流的主要内容,如果未能解决你的问题,请参考以下文章

java8-Stream流API

list去重+Java8-Stream distinct 根据list某个字段去重

Java8-stream findAny()注意点

java内存流:java.io.ByteArrayInputStreamjava.io.ByteArrayOutputStreamjava.io.CharArrayReaderjava.io(代码片段

java缓冲字符字节输入输出流:java.io.BufferedReaderjava.io.BufferedWriterjava.io.BufferedInputStreamjava.io.(代码片段

此应用小部件片段中所有意图 (PendingIntents) 的逻辑流