Lambda 如何使用Java8流从地图列表中找到每个用户的最低分数
假设我有以下地图列表Lambda 如何使用Java8流从地图列表中找到每个用户的最低分数,lambda,java-8,java-stream,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(Col
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));
我试过了,但没用
Map<String, Integer> result = scores.stream()
.flatMap(m -> m.entrySet().stream())
.collect(Collectors.groupingBy(Map.Entry::getKey, Collectors.minBy(Comparator.comparingInt(Map.Entry::getValue))));
Map result=scores.stream()
.flatMap(m->m.entrySet().stream())
.collect(Collectors.groupingBy(Map.Entry::getKey,Collectors.minBy(Comparator.comparingInt(Map.Entry::getValue)));
谁能告诉我怎么做
提前感谢。下游收集器返回
可选,但只需整数即可。因此,您应该使用来调整下游收集器。也考虑使用静态方法。
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())));
Map结果=分数
.stream()
.flatMap(m->m.entrySet().stream())
.collect(Collectors.groupingBy(Map.Entry::getKey、,
收藏,收藏,然后(
Collectors.minBy(Map.Entry.comparingByValue()),
opt->opt.get().getValue());
映射结果=
scores.stream()
.flatMap(map->map.entrySet().stream())
.collect(Collectors.toMap(Map.Entry::getKey、,
Map.Entry::getValue,
数学:min);
另一种方式,不使用流,但具有Java 8功能:
Map<String, Integer> result = new HashMap<>();
scores.forEach(map -> map.forEach((k, v) -> result.merge(k, v, Integer::min)));
Map result=newhashmap();
scores.forEach(map->map.forEach((k,v)->result.merge(k,v,Integer::min));
这将使用该方法为已存在的密钥选择最小值。感谢您的解释。
Map<String, Integer> result =
scores.stream()
.flatMap(map -> map.entrySet().stream())
.collect(Collectors.toMap(Map.Entry::getKey,
Map.Entry::getValue,
Math::min));
Map<String, Integer> result = new HashMap<>();
scores.forEach(map -> map.forEach((k, v) -> result.merge(k, v, Integer::min)));