映射 Collectors.grouping 中的值By()
2022-09-02 11:32:09
为了这个例子,让我们假设我有一个具有两个属性的简单类型:Tuple
interface Tuple<T, U> {
T getFirst();
U getSecond();
}
现在,我想将元组集合转换为映射,该映射将每个值映射到具有该特定值的元组中包含的所有值的集合。该方法显示了一个可能的实现,可以执行我想要的操作:(first, second)
first
second
first
groupSecondByFirst()
<T, U> Map<T, Set<U>> groupSecondByFirst(Set<Tuple<T, U>> tuples) {
Map<T, Set<U>> result = new HashMap<>();
for (Tuple<T, U> i : tuples) {
result.computeIfAbsent(i.getFirst(), x -> new HashSet<>()).add(i.getSecond());
}
return result;
}
如果输入是输出,则输出将是[(1, "one"), (1, "eins"), (1, "uno"), (2, "two"), (3, "three")]
{ 1 = ["one", "eins", "uno"], 2 = ["two"], 3 = ["three"] }
我想知道是否以及如何使用streams框架实现它。我得到的最好的是以下表达式,它返回一个映射,其中包含完整的元组作为值,而不仅仅是它们的元素:second
Map<T, Set<Tuple<T, U>>> collect = tuples.stream().collect(
Collectors.groupingBy(Tuple::getFirst, Collectors.toSet()));