美文网首页技术干货Java
【Java必修课】Java 8基本类型的Stream

【Java必修课】Java 8基本类型的Stream

作者: 南瓜慢说 | 来源:发表于2019-10-09 23:13 被阅读0次

    Stream主要用于对象类型的集合,幸运的是,JDK还提供了基本类型的Stream,这让我们可以直接使用IntStream,而不是Stream<Integer>。

    算术操作

    我们经常会用求最小值、最大值、和、平均数等常用的操作,就以此为例开始吧:

    int[] integers = new int[]{20, 98, 12, 7, 35};
    int min = Arrays.stream(integers)
            .min()
            .getAsInt();
    

    我们使用Arrays的stream()方法创建了一个int类型的stream,通过min()求出最小值(OptionalInt),最后通过getAsInt()返回int的值。

    另一个创建IntStream的方法如下:

    int max = IntStream.of(23, 32, 98, 1, 3)
            .max()
            .getAsInt();
    

    同样,求和与平均数都是非常便利的:

    int sum = IntStream.of(3, 2, 1).sum();
     double avg = IntStream.of(73, 232, 232, 1)
          .average()
          .getAsDouble();
    

    范围操作

    我们可以基本范围来生成基本类型的Stream,这个在写Unit Tests的时候可真是太方便了。

    int sum1 = IntStream.range(1, 10)
            .sum();//return 45
    int sum2 = IntStream.rangeClosed(1, 10)
            .sum();//return 55
    

    需要注意range()和rangeClosed()的区别,range()是exclusive最后一个值的,rangeClosed()是inclusive的。

    遍历操作:

    IntStream.rangeClosed(1, 5)
      .forEach(System.out::println);
    

    并行操作:

    IntStream.rangeClosed(1, 5)
      .parallel()
      .forEach(System.out::println);
    

    自动装箱和自动拆箱

    有时我们需要将基本类型转化为对应的wrapper类型,就需要用到自动装箱操作:

    List<Integer> evenInts = IntStream.rangeClosed(1, 10)
        .filter(num -> num % 2 == 0)
        .boxed()
        .collect(Collectors.toList());
    

    同时,我们也可以将wrapper类型转化为基本类型:

    sum = Arrays.asList(1,2,3,4)
        .stream()
        .mapToInt( i -> i)
        .sum();
    

    总结

    即使我们比较少会用到基本类型的流,但当我们需要用的时候,它可以提高我们的效率。

    相关文章

      网友评论

        本文标题:【Java必修课】Java 8基本类型的Stream

        本文链接:https://www.haomeiwen.com/subject/srvnpctx.html