![](/img/trans.png)
[英]How to convert List<Object> into List<Map<String,String>> in java8
[英]Java8 convert List of Map to List of string
我使用Java8來實現以下功能,
Map<String, String> m0 = new HashMap<>();
m0.put("x", "123");
m0.put("y", "456");
m0.put("z", "789");
Map<String, String> m1 = new HashMap<>();
m1.put("x", "000");
m1.put("y", "111");
m1.put("z", "222");
List<Map<String, String>> l = new ArrayList<>(Arrays.asList(m0, m1));
List<String> desiredKeys = Lists.newArrayList("x");
List<Map<String, String>> transformed = l.stream().map(map -> map.entrySet().stream()
.filter(e -> desiredKeys.stream().anyMatch(k -> k.equals(e.getKey())))
.collect(Collectors.toMap(e -> e.getKey(), p -> p.getValue())))
.filter(m -> !m.isEmpty())
.collect(Collectors.toList());
System.err.println(l);
System.err.println(transformed);
List<String> values = new ArrayList<>();
for (Map<String,String> map : transformed) {
values.add(map.values().toString());
System.out.println("Values inside map::"+map.values());
}
System.out.println("values::"+values); //values::[[123], [000]]
在這里,我想從列表中僅獲取x值。 我已經實現了它,但它的格式不正確。
預期產出:價值:: [123,000]
實際輸出:值:: [[123],[000]]
我知道如何修復實際輸出。 但有沒有簡單的方法來實現這個問題? 任何幫助都會很明顯。
您無需遍歷整個地圖以按鍵查找條目。 這就是Map.get
的用途。 要展平值列表的列表,請使用flatMap
:
import static java.util.stream.Collectors.toList;
.....
List<String> values = l.stream()
.flatMap(x -> desiredKeys.stream()
.filter(x::containsKey)
.map(x::get)
).collect(toList());
另外,請避免使用l
(小寫L)作為變量名。 它看起來太像1
。
我不確定Streams會不會有幫助。 通過地圖循環更容易:
Collection<String> values = new ArrayList<>();
for (Map<String, String> map : l) {
Map<String, String> copy = new HashMap<>(map);
copy.keySet().retainAll(desiredKeys);
values.addAll(copy.values());
}
在地圖流上的平面地圖,以獲得表示所有輸入地圖的地圖條目的單個流。 從那里,您可以過濾掉其鍵未包含在所需鍵中的每個條目。 最后,提取每個條目的等效值以將它們收集到列表中。
final List<String> desiredValues = l.stream()
.map(Map::entrySet)
.flatMap(Collection::stream)
.filter(entry -> desiredKeys.contains(entry.getKey()))
.map(Map.Entry::getValue)
.collect(Collectors.toList());
編輯
這假定如果地圖具有鍵“x”,則它還必須具有鍵“y”,以便獲取相應的值。
final List<String> desiredValues = l.stream()
.filter(map -> map.containsKey("x"))
.map(map -> map.get("y"))
.collect(Collectors.toList());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.