簡體   English   中英

使用Streams過濾基於鍵列表的Map

[英]Using Streams filter Map based on a list of keys

我有一個特殊的問題,並想知道Java 8 Streams API是否可以解決它。 我知道這可以在使用Streams API之外完成,但我不想添加與嘗試實現相關的所有樣板代碼,如果可以使用Streams完成的話。 我有一張地圖

Map<String, String> greetings = new HashMap<>();
greetings.put("abc", "Hello");
greetings.put("def", "Goodbye");
greetings.put("ghi", "Ciao");
greetings.put("xyz", "Bonsoir");

和一個鍵列表:

List<String> keys = Arrays.asList("def", "zxy");

並使用上面的Streams API,可以將其過濾到:

Map<String, String> filteredGreetings = new HashMap<>();
filteredGreetings.put("def", "Goodbye");
filteredGreetings.put("xyz", "Bonsoir");

希望這對我想要實現的目標是有意義的。

到目前為止,我只有在指定過濾地圖的keySet的確切鍵時才能使用它,但是這只會返回一個條目集。 我對完全過濾下來的地圖感興趣,我正在努力實現這一目標。

如果問題中的輸入和預期輸出不是拼寫錯誤 ,您還可以將輸入映射的鍵保留為:

Map<String, String> futureGreetings = new HashMap<>(greetings);
futureGreetings.keySet().retainAll(keys);

試試這個:

Map<String, String> result = keys.stream()
        .filter(greetings::containsKey)
        .collect(Collectors.toMap(Function.identity(), greetings::get));

或者反過來說:

Map<String, String> result = greetings.entrySet().stream()
        .filter(e -> keys.contains(e.getKey()))
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

對於第二種方法,我建議使用Set<String>來獲取更大的keys列表,因為它具有.contains()O(1)時間復雜度,因為它不包含任何重復項:

Set<String> keys = new HashSet<>(Arrays.asList("def", "zxy"));

試試這個

filteredGreetings= keys.stream()
                  .collect(Collectors.toMap(Function.identity(),key->greetings.get(key)));

或者甚至對於缺席密鑰,您可以使用getOrDefault()方法。

... .collect(Collectors.toMap(Function.identity(),key->greetings.getOrDefault(key,"")));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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