我试图找到如何从元组列表创建列表元组。 例如
f(list<tuple<u,v>>) => tuple<list<u>,list<v>>
标准API似乎无法很好地适应此用例。
Other articles说要使用reduce
,但这是行不通的,因为它只会返回与输入类型相同的类型。
In .net我将使用Enumerable.Aggregate
来实现。
在Java中有实现此目的的功能方法吗?
答案 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