Java Collector.groupingBy()中的映射值
在本例中,假设我有一个简单的类型Java Collector.groupingBy()中的映射值,java,functional-programming,java-8,java-stream,Java,Functional Programming,Java 8,Java Stream,在本例中,假设我有一个简单的类型Tuple,具有两个属性: interface Tuple<T, U> { T getFirst(); U getSecond(); } 如果输入是[(1,“一”),(1,“EIN”),(1,“uno”),(2,“二”),(3,“三”)]则输出将是{1=[“一”,“EIN”,“uno”],2=[“二”],3=[“三”]} 我想知道是否以及如何使用streams框架实现这一点。我得到的最好的表达式是以下表达式,它返回一个映射,其中包含作
Tuple
,具有两个属性:
interface Tuple<T, U> {
T getFirst();
U getSecond();
}
如果输入是[(1,“一”),(1,“EIN”),(1,“uno”),(2,“二”),(3,“三”)]
则输出将是{1=[“一”,“EIN”,“uno”],2=[“二”],3=[“三”]}
我想知道是否以及如何使用streams框架实现这一点。我得到的最好的表达式是以下表达式,它返回一个映射,其中包含作为值的完整元组,而不仅仅是它们的second
元素:
Map<T, Set<Tuple<T, U>>> collect = tuples.stream().collect(
Collectors.groupingBy(Tuple::getFirst, Collectors.toSet()));
Map collect=tuples.stream().collect(
Collectors.groupingBy(Tuple::getFirst,Collectors.toSet());
我找到了一个解决方案;它涉及到Collections.mapping()
,它可以包装收集器并在流上应用映射函数,以向包装的收集器提供元素:
static <T, U> Map<T, Set<U>> groupSecondByFirst(Collection<Tuple<T, U>> tuples) {
return tuples
.stream()
.collect(
Collectors.groupingBy(
Tuple::getFirst,
Collectors.mapping(
Tuple::getSecond,
Collectors.toSet())));
}
静态映射组secondbyfirst(集合元组){
返回元组
.stream()
.收集(
收集者分组(
元组::getFirst,
图(
Tuple::getSecond,
Collectors.toSet());
}
static <T, U> Map<T, Set<U>> groupSecondByFirst(Collection<Tuple<T, U>> tuples) {
return tuples
.stream()
.collect(
Collectors.groupingBy(
Tuple::getFirst,
Collectors.mapping(
Tuple::getSecond,
Collectors.toSet())));
}