如何使用Java 8流从地图列表中查找每个用户的最低分数

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)

谁能告诉我怎么做?

提前致谢.

JB *_*zet 6

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)


Tag*_*eev 5

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)