以下只是部分方法
- 终止操作会从流的流水线生成结果。其结果可以是任何不是流的值,例
如:List、Integer,甚至是 void 。 - 流进行了终止操作后,不能再次使用。
1、匹配与查找
| 方法 | 描述 |
|---|
| allMatch(Predicate p) | 检查是否匹配所有元素 |
| anyMatch(Predicate p) | 检查是否至少匹配一个元素 |
| noneMatch(Predicate p) | 检查是否没有匹配所有元素 |
| findFirst() | 返回第一个元素 |
| findAny() | 返回当前流中的任意元素 |
| count() | 返回流中元素总数 |
| max(Comparator c) | 返回流中最大值 |
| min(Comparator c) | 返回流中最小值 |
| forEach(Consumer c) | 内部迭代(使用 Collection 接口需要用户去做迭代,称为外部迭代。相反,Stream API 使用内部迭代——它帮你把迭代做了) |
2、映射
| 方法 | 描述 |
|---|
| map(Function mapper) | 接收 Lambda 将元素转换成其他 形式 或提取信息 。接收 一个函数作为参数 该函数会被应用到每个元素上, 并将其映射成一个行的元素 |
| flatMap | 接收一个函数作为参数 将流中的每个值 都换成另一个流 然后把所有的流 连成一个流 |
map: 将每个字符串变大写
List<String> list = Arrays.asList("aaa", "bbbb", "sss", "ccc");
list.stream().map((str) -> str.toLowerCase()).forEach(System.out::println);
floatMap: 将其中字符串变大写按字母升序排列
// 会合并每一个流 转为一个流 参考:list.allAll();
list.stream().flatMap(TestStream2::filterCharacter).forEach(System.out::println);
public static Stream<Character> filterCharacter(String str) {
List<Character> list = new ArrayList<>();
for (Character c : str.toCharArray()) {
list.add(c);
}
return list.stream();
}
3、归约
| 方法 | 描述 |
|---|
| reduce(T iden, BinaryOperator b) | 可以将流中元素反复结合起来,得到一个值。返回 T |
| reduce(BinaryOperator b) | 可以将流中元素反复结合起来,得到一个值。返回 Optional |
- 备注:map 和 reduce 的连接通常称为 map-reduce 模式,因 Google
用它来进行网络搜索而出名。
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 10);
// 0 -- (0,1)->0+1 -> 1 (1,2)->1+2 -> 3 (3,3) -> 3+3
Integer reduce = list.stream().reduce(0, (x, y) -> x + y);
// map - reduce 模式
Optional<Integer> reduce1 = employees.stream().map(Employee::getMoney).reduce(Integer::sum);
4、收集
| 方法 | 描述 |
|---|
| collect(Collector c) | 将流转换为其他形式。接收一个 Collector |
List<String> collect = employees.stream().map(Employee::getName).collect(Collectors.toList());
System.out.println(collect);
Set<String> collect1 = employees.stream().map(Employee::getName).collect(Collectors.toSet());
System.out.println(collect1);
HashSet<String> collect2 = employees.stream().map(Employee::getName).collect(Collectors.toCollection(HashSet::new));
System.out.println(collect2);
// 平均值
Double collect3 = employees.stream().collect(Collectors.averagingInt(Employee::getMoney));
System.out.println(collect3);
// 总和
IntSummaryStatistics collect4 = employees.stream().collect(Collectors.summarizingInt(Employee::getMoney));
//最大值
employees.stream().map(Employee::getMoney).collect(Collectors.maxBy(Integer::compareTo));
// 最小值
Optional<Integer> collect5 = employees.stream().map(Employee::getMoney).collect(Collectors.minBy(Integer::compare));
Collector 接口中方法的实现决定了如何对流执行收集的操作(如收集到 List、Set、Map)。
分组
@Test
public void test5() {
// 分组
Map<Status, List<Employee>> collect6 = employees.stream().collect(Collectors.groupingBy(Employee::getStatus));
// 多级分组
//
Map<Status, Map<String, List<Employee>>> collect7 = employees.stream()
.collect(Collectors.groupingBy(Employee::getStatus, Collectors.groupingBy((e) -> {
if (e.getAge() < 20) {
return "小20";
} else if (e.getAge() < 30) {
return "小30";
} else {
return "大30";
}
})));
System.out.println(collect7);
}
分区
@Test
public void test6(){
Map<Boolean, List<Employee>> collect = employees.stream().collect(Collectors.partitioningBy((e) -> e.getMoney() > 6000));
System.out.println(collect);
System.out.println("----------------");
IntSummaryStatistics collect1 = employees.stream().collect(Collectors.summarizingInt(Employee::getMoney));
System.out.println(collect1.getCount());
System.out.println(collect1.getMax());
System.out.println(collect1.getAverage());
System.out.println(collect1.getMin());
System.out.println(collect1.getSum());
System.out.println("----------------");
String collect2 = employees.stream().map(Employee::getName).collect(Collectors.joining(",","==","=="));
System.out.println(collect2);
}
- 另外, Collectors 实用类提供了很多静态方法,可以方便地创建常见收集器实例,
具体方法与实例如下表:
