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())));
}