stream流
stream是对集合对象功能的增强,与Lambda表达式结合,提高编程效率,间接性和程序可读性。
流程:
-
将集合转换为stream流(或者创建流)。
-
操作stream流(中间操作.终端操作)。
stream流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果
流的创建
生成流有五种方式:
-
stream创建
Stream<Integer> stream = Stream.of(1, 4, 2, 54);
-
Collection集合创建
ArrayList<Integer> list = new ArrayList<>(); list.add(1); list.add(3); list.add(5); list.add(7); Stream<Integer> listStream = list.stream();
-
Array数组创建
int[] ints = {1,4,6,8}; IntStream intStream = Arrays.stream(ints); 通过 Arrays.stream方法生成流,该方法产生的流是数值流(IntStream)而不是stream。 使用数值流可以避免计算过程中拆箱装箱,提高性能。 Stream API提供了mapToInt 、 mapToDouble 、mapToLong 三种方式将对象流转换为对应的数值流,同时提供boxed方法将数值流转换为对象流
-
文件创建
try { Stream<String> fileStream = Files.lines(Paths.get("data.txt"), Charset.defaultCharset()); } catch (IOException e) { throw new RuntimeException(e); }
通过Files.line方法得到一个流,并且得到的每个流是给定文件中的一行
-
函数创建
Stream<Integer> iterateStream = Stream.iterate(0, n -> n + 2).limit(5); iterateStream.forEach(System.out::println);
iterate 方法接收两个参数,第一个为初始化值,第二个为函数进行的操作,iterate 生成的流为无限流,所以使用limit进行截断,最后只生成五个偶数
Stream<Double> generateStream = Stream.generate(Math::random).limit(5); generateStream.forEach(System.out::printl