Stream

处理流程

20233915651

获取流

Stream类

Stream<Integer> integerStream = Stream.of(1, 2, 3);
Stream<Double> stream = Stream.generate(Math::random);
Stream<BigInteger> iterate = Stream.iterate(BigInteger.ZERO, n -> n.add(BigInteger.ONE));

根据Collection获取

Stream<String> stream = list.stream(); 

根据Map获取流

Stream<String> keyStream = map.keySet().stream(); 
Stream<String> valueStream = map.values().stream();
Stream<Map.Entry<String, String>> entryStream = map.entrySet().stream();

基本类型流

并行流

流的方法

操作类型 接口方法
中间操作 concat() distinct() filter() flatMap() limit() map() peek() skip() sorted() parallel() sequential() unordered()
结束操作 allMatch() anyMatch() collect() count() findAny() findFirst() forEach() forEachOrdered() max() min() noneMatch() reduce() toArray()

转换方法

过滤filter

去重distinct

排序sorted

map

利用方法引用对流每个元素进行函数计算

Stream.of(1,2,3)
        .map(String::valueOf)
        .forEach(System.out::println); // ["1","2","3"]

flatMap

对结果进行展开

抽取limit

只取前n个

跳过skip

跳过前n个

连接concat

Stream.concat(s1,s2); // 连接两个流

额外调试peek

可以对流操作,但是不影响它

Optional

Optional<T>

使用

注意事项

终结方法

聚合函数

归约函数

reduce,传递一个二元函数BinaryOperator,对流元素进行计算

如求和、求积、字符串连接

// 求单词长度之和
Stream<String> stream = Stream.of("I", "love", "you", "too");
Integer lengthSum = stream.reduce(0, // 初始值 // (1)
        (sum, str) -> sum+str.length(), // 累加器 // (2)
        (a, b) -> a+b); // 部分和拼接器,并行执行时才会用到 // (3)
// int lengthSum = stream.mapToInt(str -> str.length()).sum();
System.out.println(lengthSum);

collect方法

// 将Stream转换成容器或Map
Stream<String> stream = Stream.of("I", "love", "you", "too");
List<String> list = stream.collect(Collectors.toList()); // (1)
// Set<String> set = stream.collect(Collectors.toSet()); // (2)
// Map<String, Integer> map = stream.collect(Collectors.toMap(Function.identity(), String::length)); // (3)

迭代函数

收集函数

优点

与循环迭代比较

注意事项

Stream流水线原理

20214615247

parallelStream 通过默认的ForkJoinPool,可能提高多线程任务的速度

多个parallelStream之间默认使用的是同一个线程池