2、collectingAndThen
static <T,A,R,RR> Collector<T,A,RR> collectingAndThen(Collector<T,A,R> downstream, Function<R,RR> finisher)
根据函数名称可以简单理解为先collect然后再对其结果进行后续操作。
在上面的averagingInt函数的使用方法示例中由于collect得出的结果为Double类型,因此最后我们还需要进行intValue转换为int类型,如果我们使用collectingAndThen可以把上面的示例改造为:
void test18() {
List<String> list = List.of("1","2","3","4","100");
//int avg = list.stream().collect(Collectors.averagingInt(Integer::parseInt)).intValue();
int avg = list.stream().collect(Collectors.collectingAndThen(Collectors.averagingInt(Integer::parseInt), a -> a.intValue()));
System.out.println(avg);
}
从这个示例我们就可以很明了的看到collectingAndThen函数的作用,这个例子看起来比直接用averagingInt函数复杂了些,好像没有什么优势,其实collectingAndThen函数大多是用在对结果集的排序之类的操作上,这样就可以显现collectingAndThen函数的优势。
看下面这个例子:
void test19() {
List<String> list = List.of("7m","6j","9k","4y","5l","3o","8j");
ArrayList ts = list.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(a -> a.charAt(0)))), ArrayList::new));
System.out.println(ts.toString());
}
这个例子的作用就是对list中的元素按首字母大小排序,把排序结果以ArrayList类型输出。输出结果如下:
[3o, 4y, 5l, 6j, 7m, 8j, 9k]
上面这个例子就能发挥出collectingAndThen的威力。