说我有以下信息流:
...
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)...;
对于 result1 ,我想按对的键分组并获取所有对应的名称。
对于 result2 ,我想按键分组并获取 字符串列表 (上一个结果的任意一个) )。
通过使用Java 8流api如何实现?
答案 0 :(得分:4)
您可以这样做
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));
如果将行类型与数组一起使用,则此版本具有必要的强制转换,如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)
);
}