Collectors.collectingAndThen详解
时间: 2023-09-13 09:05:49 浏览: 165
`Collectors.collectingAndThen()` 是一个非常有用的方法,它可以将一个收集器(Collector)转换为另一个收集器或者一个最终的结果。
它的方法签名如下:
```java
public static <T, A, R, RR> Collector<T, A, RR> collectingAndThen(Collector<T, A, R> downstream, Function<R, RR> finisher)
```
其中,`downstream` 参数是需要转换的收集器,`finisher` 参数是一个函数,它将最终的结果类型 `R` 转换为另一个类型 `RR`。
`Collectors.collectingAndThen()` 方法的作用是,首先使用 `downstream` 收集器收集元素,然后将收集的结果交给 `finisher` 函数进行最终的转换,得到最终的结果 `RR`。
例如,可以将 `Collectors.toList()` 收集器转换为一个 `List` 类型的最终结果:
```java
List<String> strings = Arrays.asList("a", "b", "c", "d", "e");
List<String> result = strings.stream()
.collect(Collectors.collectingAndThen(Collectors.toList(), ArrayList::new));
```
在上面的示例中,我们将一个字符串列表转换为一个新的 `ArrayList` 对象,使用了 `Collectors.collectingAndThen()` 方法,将 `Collectors.toList()` 收集器转换为一个 `List` 类型的最终结果。
除了将收集器转换为最终结果类型之外,`Collectors.collectingAndThen()` 方法还可以将收集器转换为另一个收集器。例如,可以将一个收集器转换为一个 `Map` 类型的收集器:
```java
List<String> strings = Arrays.asList("a", "bb", "ccc", "dddd", "eeeee");
Map<Integer, String> result = strings.stream()
.collect(Collectors.collectingAndThen(
Collectors.toMap(String::length, Function.identity()), Collections::unmodifiableMap));
```
在上面的示例中,我们将一个字符串列表按照长度进行分组,然后使用 `Collectors.collectingAndThen()` 方法,将 `Collectors.toMap()` 收集器转换为一个不可修改的 `Map` 类型的最终结果。这里的 `Function.identity()` 方法用于将字符串本身作为 `Map` 的值,`Collections::unmodifiableMap` 方法用于将 `Map` 包装为不可修改的形式。
阅读全文