前面的文章有介绍:为了解决装箱带来的效率问题,java8针对原始类型提供了一些特化的函数式接口,如:IntPredicate。流也不例外,它提供了3个的原始类型数值流:
- IntStream
- LongStream
- DoubleStream
分别将流中的元素特化为int、long、double,从而避免暗含的装箱成本。
IntStream intStream = menu.stream().mapToInt(Dish::getCalories);
IntStream intStream = menu.stream().mapToInt(Dish::getCalories);
Stream<Integer> stream = intStream.boxed();
数值流的归约操作:求和(sum)、最大值(max)、最小值(min)
//求和
int calories = menu.stream().mapToInt(Dish::getCalories).sum();
//最大值
OptionalInt maxCalories = menu.stream().mapToInt(Dish::getCalories).max();
//最小值
OptionalInt minCalories = menu.stream().mapToInt(Dish::getCalories)
.min();
//表示[1,100],包含100
IntStream evenNumbers = IntStream.rangeClosed(1, 100);
//表示[1,100),不包含100
IntStream evenNumbers = IntStream.range(1, 100);
流的构建有如下几种方式
- 由值创建流
- 由数组创建流
- 从文件生成流
- 由函数生成流
创建一个String Stream:
Stream<String> stream = Stream.of("Java 8 ", "Lambdas ", "In ", "Action");
得到一个空流:
Stream<String> emptyStream = Stream.empty();
int[] numbers = {2, 3, 5, 7, 11, 13};
int sum = Arrays.stream(numbers).sum();
System.out.pringln(sum);
打印结果为41。
Stream<String> lines =
Files.lines(Paths.get("data.txt"), Charset.defaultCharset());
java.nio.file.Files的静态方法lines返回一个由文件每一行组成一个元素的字符串流。
使用迭代生成无限流:
Stream.iterate(0, n -> n + 2).limit(10).forEach(System.out::println);
iterate方法的第一个参数是初始值,第二个参数为一元操作函数接口UnaryOperator< T >,上面的代码会无穷尽地生成以0开始,以2为步长递增的整数,如果不使用limit的话。
使用生成方法:
Stream.generate(Math::random).limit(5).forEach(System.out::println);
generate接受一个参数供应者Supplier< T >以为流提供新的元素,上面的代码若没有limit(5)的限制将会生成无限流