【问题标题】:Filter List of Map Based on Key Using Java Streams [closed]使用Java Streams基于键过滤地图列表[关闭]
【发布时间】:2022-01-03 05:13:12
【问题描述】:

有List>,如下:

[
 {"A": "ABC","B": "ABCD","C": "0.945"},
 {"A": "ABC","B": "AB","C": "0.871"},
 {"A": "XYZ","B": "XYZA","C": "0.765"},
 {"A": "ABC","B": "ABD","C": "0.945"},
 {"A": "XYZ","B": "XYZB","C": "0.563"}
]

问题

在 List 上方过滤以获得一个 Map,其中键为“A”,该“A”的最高值为“C”。

{"ABC": "0.945", "XYZ": "0.765"}

初始代码

Map<String, String> m0 = new HashMap<>();
m0.put("A", "ABC");
m0.put("B", "ABCD");
m0.put("C", "0.945");

Map<String, String> m1 = new HashMap<>();
m1.put("A", "ABC");
m1.put("B", "AB");
m1.put("C", "0.871");

Map<String, String> m2 = new HashMap<>();
m2.put("A", "XYZ");
m2.put("B", "XYZA");
m2.put("C", "0.765");

Map<String, String> m3 = new HashMap<>();
m3.put("A", "ABC");
m3.put("B", "ABD");
m3.put("C", "0.945");

Map<String, String> m4 = new HashMap<>();
m4.put("A", "XYZ");
m4.put("B", "XYZB");
m4.put("C", "0.563");

List<Map<String,String>> res = Arrays.asList(m0,m1,m2,m3,m4);

我能够得到:

[{A=ABC, B=ABCD, C=0.945}, {A=XYZ, B=XYZA, C=0.765}]

使用下面的代码:

List<Map<String, String>> result = res.stream().collect(Collectors.groupingBy(map->map.get("A")))
                .entrySet().stream().map(m -> m.getValue().stream()
                        .max(Comparator.comparingDouble(s -> Double.parseDouble(s.get("C")))).get())
                .collect(Collectors.toList());

【问题讨论】:

    标签: java java-8 java-stream


    【解决方案1】:

    从丢弃不需要的条目并仅保留 AC 的值作为键/值对开始使用会更容易。

    Map<String, Double> result = res.stream()
            .map(m -> Map.entry(m.get("A"), 
                                Double.parseDouble(m.get("C"))))
            .collect(Collectors.groupingBy(Entry::getKey,
                    Collectors.mapping(Entry::getValue, 
                                       Collectors.maxBy(Double::compare))))
            .entrySet().stream()
            .collect(Collectors.toMap(Entry::getKey, e -> e.getValue().get()));
    

    根据需要将{ABC=0.945, XYZ=0.765} 生成为result;但使用两个流来摆脱 Optional&lt;Double&gt; 类型的值。

    【讨论】:

    • 我使用的是 Java 8,所以用新的 AbstractMap.SimpleEntry 替换 Map.entry 对我有用,谢谢您的回答。
    猜你喜欢
    • 1970-01-01
    • 2015-04-10
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-16
    相关资源
    最近更新 更多