这两个函数是比较常见的,也比较好理解mapping就是一个先映射后汇聚的函数,collectingAndThen则相反,是先汇聚再进行后续操作的函数,toMap是一个toCollections类的函数,本应该在之前的系列讲,但是实现跟toCollections不是同一个套路,我们把它放在这讲。
1.mapping(Function<? super T, ? extends U> mapper, Collector<? super U, A, R> downstream)
这个方法等同于
stream.mapping(mapper)
.collect(downStream)
具体的实现:
BiConsumer<A, ? super U> downstreamAccumulator = downstream.accumulator();
return new CollectorImpl<>(downstream.supplier(),
(r, t) -> downstreamAccumulator.accept(r, mapper.apply(t)),
downstream.combiner(), downstream.finisher(),
downstream.characteristics());
非常一目了然的实现,先将T映射到K然后再进行后续的操作,所以只需要在accumulate的时候做一个额外的处理,即调用mapper.apply(t)方法,将T变成K
这个方法在多层级的聚合操作中是非常适用的,比如官方文档给出的例子:
Map<City, Set<String>> lastNamesByCity
= people.stream().collect(groupingBy(Person::getCity