簡體   English   中英

如何使用 Java 流 api 過濾地圖?

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

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