我正在尝试实现一个简单的收集器,它采用收集器列表,并同时以略有不同的方式从流中收集值。
它与 非常相似Collectors.teeing,但不同之处在于
我想要的类型签名是
public static <T, R> Collector<T, ?, List<R>> list(
final List<Collector<T, ?, R>> downstreamCollectors);
Run Code Online (Sandbox Code Playgroud)
创建此类收集器的一种方法是递归地配对发球收集器,如下所示:
public static <T, R> Collector<T, ?, List<R>> list(
final List<Collector<T, ?, R>> downstreamCollectors) {
return listrec(
Collectors.collectingAndThen(downstreamCollectors.get(0), List::of),
downstreamCollectors.stream().skip(1).toList());
}
private static <T, R> Collector<T, ?, List<R>> listrec(
final Collector<T, ?, List<R>> teedCollectors,
final List<Collector<T, ?, R>> downstreamCollectors) {
if (downstreamCollectors.size() == 0) {
return teedCollectors;
} else {
return listrec(
teeing(
teedCollectors,
downstreamCollectors.get(0),
(l, s) -> Stream.concat(l.stream(), …Run Code Online (Sandbox Code Playgroud) java functional-programming type-inference java-stream collectors