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

Java 使用流从元组列表生成列表元组,java,Java,我试图找到如何从元组列表创建列表元组。 比如说 f(list)=>tuple 标准API似乎不能很好地适应这个用例。 假设使用reduce,但这不起作用,因为它只返回与输入类型相同的类型 我将使用Enumerable.Aggregate来实现这一点 在java中是否有实现这一点的功能方法?Java12将提供收集器。teeing允许应用两个收集器,然后合并它们的结果 同时,您可以应用reduce Tuple<List<U>,List<V>> tupleOfLis

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

f(list)=>tuple

标准API似乎不能很好地适应这个用例。 假设使用
reduce
,但这不起作用,因为它只返回与输入类型相同的类型

我将使用
Enumerable.Aggregate
来实现这一点


在java中是否有实现这一点的功能方法?

Java12将提供
收集器。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;
    }
  );
Tuple tupleOfLists=listOfTuples
.stream()
.减少(
新元组(新ArrayList(),新ArrayList()),
(元组列表,元组)->{
tupleOfLists.left().add(tuple.left());
tupleOfLists.right().add(tuple.right());
返回元组列表;
},
(TupleOflist1,TupleOflist2)->{
tupleOfLists1.left().addAll(tupleOfLists2.left());
tupleOfLists1.right().addAll(tupleOfLists2.right());
返回元组列表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)
 ));
我自己并没有这样做-只是在这里找到了一个类似的例子:
teeing
将接受两个收集器,我不认为您可以在这里使用
map
。我会说它可能是。teeing(toList(),toList(),(a,b)->新元组(a.map(Tuple::left)。collect(toList()),b.map(Tuple::right)。collect(toList())或者更好。您首先编写自己的
映射收集器,然后
teeing(mapAndCollect(Tuple::left)、mapAndCollect(Tuple::right),(a,b)->新的Tuple(a,b))
这似乎不起作用,因为方法
reduce
被定义为
T reduce(T标识,二进制运算符累加器);
。这意味着
(tupleoflist,Tuple)
的lambda不是
(已更新。它应该使用带3个参数的reduce。如果您运行并行流,则需要使用第三个参数。如果您知道您永远不会并行运行,则可以使用
(tupleOfLists1,tupleOfLists2)->tupleOfLists1
,甚至可以使用dummy
(t1,t2)->null
我错过了重载。谢谢!