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
我错过了重载。谢谢!