[英]How to filter a map with Java stream api?
Map<Integer, String> map = new HashMap<>();
map.put(1, "f");
map.put(2, "I");
map.put(3, "a");
map.put(4, "c");....etc
現在我有一個清單:
List<Integer> picks = {1,3}
我想取回字符串列表,即匹配鍵值的地圖中的值,在“選擇”列表中找到。所以,我希望返回 {"f", "a"} 作為結果。 有沒有辦法使用java流api以優雅的方式做到這一點?
當有一個 value 時,我這樣做:
map.entrySet().stream()
.filter(entry -> "a".equals(entry.getValue()))
.map(entry -> entry.getValue())
.collect(Collectors.toList())
但是當有要過濾的鍵/選擇列表時會變得困難。
你可以通過使用這樣的東西來實現這一點:
List<String> values = map.entrySet()
.stream()
.filter(entry -> picks.contains(entry.getKey()))
.map(Map.Entry::getValue)
.collect(Collectors.toList());
values.forEach(System.out::println);
輸出:
f
a
但是它可能效率不高,因為List::contains
是 O(N)。 考慮使用Set
(例如HashSet
)而不是List
進行picks
因為HashSet::contains
是 O(1)。
您可以在Stream#filter
使用List.contains()
來僅接受列表中存在的那些值:
List<String> result = map.entrySet()
.stream()
.filter(ent -> picks.contains(ent.getKey()))
.map(Map.Entry::getValue)
.collect(Collectors.toList());
您不需要遍歷整個地圖來收集選取的值。 而是迭代所需的鍵並從地圖中獲取相關值。 如果地圖比通常情況下您需要選擇的值大得多,那么這種方法應該優於另一種方法。 此外,這個解決方案更緊湊,對我來說視覺混亂更少。 這是它的外觀。
List<String> pickedValues = picks.stream().map(map::get)
.filter(Objects::nonNull)
.collect(Collectors.toList());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.