![](/img/trans.png)
[英]How to filter based on list returned by map param using Java 8 streams
[英]Filter List of Map Based on Key Using Java Streams
有List<Map<String,String>>,如下:
[
{"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"}
]
問題
在列表上方過濾以獲得 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());
當您開始丟棄不需要的條目並僅保留A
和C
的值作為鍵/值對時,會更容易。
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<Double>
類型的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.