1.特点
-
流水线: 中间流操作本身返回一个流
-
内部迭代 : 不需要显式的遍历,只能遍历一次
-
懒加载: 必须有中盾操作才会真正触发执行
2.操作
- 中间操作
- filter: 根据谓词过滤,借助Predicate<T>接口
- map: 映射,借助Function<T,R>接口
- flatmap: 平铺,借助Function<T, Stream<R>>接口
- limit: 截取的结果数量
- skip: 跳过流数量
- sorted: 排序,借助Comparator<T>接口
- distinct: 去重
- 终端操作
-
forEach: 遍历,无返回值
-
count: 计数
-
collect: 收集器
-
allMatch: 内部迭代每个元素都匹配谓词
-
anyMatch: 内部迭代部分元素蒲培谓词
-
noneMatch: 内部迭代每个元素都不匹配谓词
-
reduce: 归约聚合
-
max: 最大值
-
min: 最小值
-
3.构建流
-
Stream.of(): 根据值构建流,例如Stream.of(1,2,3)
-
Arrays.stream():将数组或集合转换为流
-
IntStream.rangeClosed(start, end): 根据数值范围构建数值流,boxed()将树脂流转为普通流
-
Files.lines(Paths.get(path): 根据文件构建流
4.代码案例
- 操作流
List<String> list = new ArrayList<>();
list.add("hello");
list.add("how");
list.add("are");
list.add("you");
list.add("tom");
list.stream().filter(s -> s.length() < 5).sorted(Comparator.reverseOrder()).forEach(System.out::println);
// flatMap将各个流扁平化
List<String> lt = list.stream().map(w -> w.split(" ")).flatMap(Arrays:: stream).collect(Collectors.toList());
// 查找和匹配
boolean b1 = list.stream().allMatch(s -> s.length() > 3); //每个元素都匹配
boolean b2 = list.stream().noneMatch(s -> s.length() > 3); //每个元素都不满足
Optional<String> str = list.stream().filter(s -> s.length() > 3).findFirst();//满足条件的第一个元素
// 归约
final Optional<Integer> reduce = Stream.iterate(1, n -> n + 1).limit(5).reduce((a, b) -> a * b);
final Optional<Integer> max = list.stream().map(String::length).max(Integer::compareTo);
// 收集器
final Long count = list.stream().collect(Collectors.counting());
final Integer sum = list.stream().collect(Collectors.summingInt(String::length));
final Double avg = list.stream().collect(Collectors.averagingDouble(String :: length));
final String joinStr = list.stream().collect(Collectors.joining());
final Optional<Integer> collectSum = list.stream().map(String::length).collect(Collectors.reducing((a, b) -> a + b));
final Map<String, List<Integer>> groupMap = list.stream().map(String::length)
.collect(Collectors.groupingBy(n -> {
if (n % 2 == 0) return "偶数";
else return "奇数";
}));
- 数值流
/数值流, 避免了装箱拆箱操作
final IntStream intStream1 = list.stream().mapToInt(String::length);
final IntStream intStream2 = IntStream.rangeClosed(1, 100).filter(n -> n % 2 == 0);
final Stream<Integer> boxed = intStream1.boxed(); // boxed数值流转换会对象流
- 并行流
// parallel(): 将顺序流转为并行流,状态流不建议使用并行流
final Optional<Integer> reduceParall = Stream.iterate(1, n -> n + 1).limit(5).parallel().reduce((a, b) -> a * b);