java8 Stream:数值流(原始类型流特化)与构建流的几种方式

前面的文章有介绍:为了解决装箱带来的效率问题,java8针对原始类型提供了一些特化的函数式接口,如:IntPredicate。流也不例外,它提供了3个的原始类型数值流:

  • IntStream
  • LongStream
  • DoubleStream

分别将流中的元素特化为int、long、double,从而避免暗含的装箱成本。

普通流转换为数值流


 
  1. IntStream intStream = menu.stream().mapToInt(Dish::getCalories);

数值流转换回普通流


 
  1. IntStream intStream = menu.stream().mapToInt(Dish::getCalories);
  2. Stream<Integer> stream = intStream.boxed();

数值流的归约操作:求和(sum)、最大值(max)、最小值(min)


 
  1. //求和
  2. int calories = menu.stream().mapToInt(Dish::getCalories).sum();
  3. //最大值
  4. OptionalInt maxCalories = menu.stream().mapToInt(Dish::getCalories).max();
  5. //最小值
  6. OptionalInt minCalories = menu.stream().mapToInt(Dish::getCalories)
  7. .min();

数值流生成数值范围


 
  1. //表示[1,100],包含100
  2. IntStream evenNumbers = IntStream.rangeClosed(1, 100);
  3. //表示[1,100),不包含100
  4. IntStream evenNumbers = IntStream.range(1, 100);

流的构建有如下几种方式

  • 由值创建流
  • 由数组创建流
  • 从文件生成流
  • 由函数生成流

由值创建流

创建一个String Stream:


 
  1. Stream<String> stream = Stream.of("Java 8 ", "Lambdas ", "In ", "Action");

得到一个空流:


 
  1. Stream<String> emptyStream = Stream.empty();

由数组创建流


 
  1. int[] numbers = {2, 3, 5, 7, 11, 13};
  2. int sum = Arrays.stream(numbers).sum();
  3. System.out.pringln(sum);

打印结果为41。

从文件生成流


 
  1. Stream<String> lines =
  2. Files.lines(Paths.get("data.txt"), Charset.defaultCharset());

java.nio.file.Files的静态方法lines返回一个由文件每一行组成一个元素的字符串流。

由函数生成流

使用迭代生成无限流:


 
  1. Stream.iterate(0, n -> n + 2).limit(10).forEach(System.out::println);

iterate方法的第一个参数是初始值,第二个参数为一元操作函数接口UnaryOperator< T >,上面的代码会无穷尽地生成以0开始,以2为步长递增的整数,如果不使用limit的话。

使用生成方法:


 
  1. Stream.generate(Math::random).limit(5).forEach(System.out::println);

generate接受一个参数供应者Supplier< T >以为流提供新的元素,上面的代码若没有limit(5)的限制将会生成无限流

    原文作者:无怨_无悔
    原文地址: https://blog.csdn.net/sdmxdzb/article/details/82740797
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞