如何按对流的键分组

Boh*_* LI 0 java java-stream

假设我有以下流:

...
import javafx.util.Pair;
...
Pair[] testPairs = {
        new Pair<>("apple", "James"),
        new Pair<>("banana", "John"),
        new Pair<>("grapes", "Tom"),
        new Pair<>("apple", "Jenkins"),
        new Pair<>("banana", "Edward"),
        new Pair<>("grapes", "Pierre")
};

Map<String, List<String>> result1 = Arrays.stream(testPairs)...;

Map<String, String> result2 = Arrays.stream(testPairs)...;
Run Code Online (Sandbox Code Playgroud)

对于result1,我想按对的键进行分组并获取所有对应的名称。对于result2,我想按键分组并获取字符串列表中的任何一个(前一个结果)。

如何通过使用 java 8 stream api 来实现这一点?

Rav*_*ala 5

你可以这样做,

Map<String, List<String>> result1 = Arrays.stream(testPairs)
    .collect(Collectors.groupingBy(Pair::getS, 
        Collectors.mapping(Pair::getT, Collectors.toList())));

Map<String, String> result2 = Arrays.stream(testPairs)
    .collect(Collectors.toMap(Pair::getS, Pair::getT, (v1, v2) -> v1));
Run Code Online (Sandbox Code Playgroud)

如果您将行类型与数组一起使用,这里是 YCF_L 的以下注释指定的具有必要强制转换的版本。

Map<String, List<String>> result1 = Arrays.stream(testPairs)
        .collect(Collectors.groupingBy(p -> (String) p.getKey(),
                Collectors.mapping(p -> (String) p.getValue(), Collectors.toList())));

Map<String, String> result2 = Arrays.stream(testPairs)
                .collect(Collectors.toMap(
                        p -> (String) p.getKey(), 
                        p -> (String) p.getValue(), 
                        (a, b) -> b)
                );
    }
Run Code Online (Sandbox Code Playgroud)