使用流从元组列表生成列表元组

时间:2019-04-22 01:49:15

标签: java

我试图找到如何从元组列表创建列表元组。 例如

f(list<tuple<u,v>>) => tuple<list<u>,list<v>>

标准API似乎无法很好地适应此用例。 Other articles说要使用reduce,但这是行不通的,因为它只会返回与输入类型相同的类型。

In .net我将使用Enumerable.Aggregate来实现。

在Java中有实现此目的的功能方法吗?

2 个答案:

答案 0 :(得分:3)

Java12将提供Collectors.teeing,它允许应用两个收集器,然后合并它们的结果

与此同时,您可以应用reduce

Tuple<List<U>,List<V>> tupleOfLists = listOfTuples
  .stream()
  .reduce(
    new Tuple<List<U>,List<V>>(new ArrayList<U>(), new ArrayList<V>()),
    (tupleOfLists, tuple) -> {
      tupleOfLists.left().add(tuple.left());          
      tupleOfLists.right().add(tuple.right());
      return tupleOfLists;
    },
    (tupleOfLists1, tupleOfLists2) -> {
      tupleOfLists1.left().addAll(tupleOfLists2.left());
      tupleOfLists1.right().addAll(tupleOfLists2.right());
      return  tupleOfLists1;
    }
  );

答案 1 :(得分:1)

似乎您需要使用Java 12来编写类似的内容:

listOfTuples.stream().collect(teeing(
  map(t -> t.u).collect(Collectors.toList()),
  map(t -> t.v).collect(Collectors.toList()), 
  (us, vs) -> new Tuple(us,vs)
 ));

我自己还没有做过-只是在这里找到一个类似的例子: https://www.baeldung.com/java-8-collectors