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