use*_*796 5 lambda java-8 java-stream
假设我有以下地图列表,
List<Map<String, Integer>> scores = new ArrayList<>();
scores.add(Collections.singletonMap("user1", 3));
scores.add(Collections.singletonMap("user3", 15));
scores.add(Collections.singletonMap("user1", 1));
scores.add(Collections.singletonMap("user2", 5));
scores.add(Collections.singletonMap("user2", 23));
scores.add(Collections.singletonMap("user1", 10));
Run Code Online (Sandbox Code Playgroud)
我想使用带有lambda表达式的Java 8流将每个用户的最低分数提取到地图中.期望的结果是
{user1=1, user2=5, user3=15}
Run Code Online (Sandbox Code Playgroud)
我试过这个并没有用,
Map<String, Integer> result = scores.stream()
.flatMap(m -> m.entrySet().stream())
.collect(Collectors.groupingBy(Map.Entry::getKey, Collectors.minBy(Comparator.comparingInt(Map.Entry::getValue))));
Run Code Online (Sandbox Code Playgroud)
谁能告诉我怎么做?
提前致谢.
Map<String, Integer> result =
scores.stream()
.flatMap(map -> map.entrySet().stream())
.collect(Collectors.toMap(Map.Entry::getKey,
Map.Entry::getValue,
Math::min));
Run Code Online (Sandbox Code Playgroud)
在minBy下游收集器返回Optional<Entry<String, Integer>>,但你需要简单的Integer.所以你应该Collectors.collectingAndThen用来适应下游的收集器.还要考虑使用Map.Entry.comparingByValue()静态方法.
Map<String, Integer> result = scores
.stream()
.flatMap(m -> m.entrySet().stream())
.collect(Collectors.groupingBy(Map.Entry::getKey,
Collectors.collectingAndThen(
Collectors.minBy(Map.Entry.comparingByValue()),
opt -> opt.get().getValue())));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
232 次 |
| 最近记录: |