如何在收集器中实现我自己的整理器?
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());
}
这样你的终结者就是恒等函数。答案的第一部分应该给你一个起点。
欢迎大家!
我想知道如何实现我自己的 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());
}
这样你的终结者就是恒等函数。答案的第一部分应该给你一个起点。