小编And*_*din的帖子

Java 收集器提供输入列表

我正在尝试实现一个简单的收集器,它采用收集器列表,并同时以略有不同的方式从流中收集值。

它与 非常相似Collectors.teeing,但不同之处在于

  1. 收到收藏家列表,而不是仅仅两个
  2. 要求所有收集器产生相同类型的值

我想要的类型签名是

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

7
推荐指数
1
解决办法
779
查看次数