簡體   English   中英

Java8將Map列表轉換為字符串列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM