如何在收集器中实现我自己的整理器?

How to implement my own finisher in a collector?

欢迎大家!

我想知道如何实现我自己的 finisher,它不是简单的,比如身份函数。 我收藏家的header是

public class SequentialPPSCollector<T> implements
    Collector<Pair<T, Double>, List<Pair<T, Double>>, List<T>> {...}

里面有一个 finisher 方法应该把 List<Pair<T, Double>> 转换成 List<T>

@Override
public Function<List<Pair<T, Double>>, List<T>> finisher() {
    return ...
}

这样就可以了

return list -> list
       .stream()
       .map(Pair::getLeft)
       .collect(Collectors.toList());

以下是将 List<Pair<T, Double>> 转换为 List<T> 的方法:

List<T> listOfT = list.stream()
                      .map(Pair::getFirst)
                      .collect(Collectors.toList());

因此您的整理函数可能如下所示:

@Override
public Function<List<Pair<T, Double>>, List<T>> finisher() {
    return list -> list.stream().map(Pair::getFirst).collect(toList());
}


虽然这个例子有点简单,因为在这种情况下你可能会像这样声明你的收集器:

class SequentialPPSCollector<T> implements Collector<Pair<T, Double>, List<T>, List<T>> {...} 

并让累加器获取 pair 对象的类型 T:

@Override
public BiConsumer<List<T>, Pair<T, Double>> accumulator() {
    return (list, p) -> list.add(p.getFirst());
}

这样你的终结者就是恒等函数。答案的第一部分应该给你一个起点。