簡體   English   中英

使用Java8流過濾Map的密鑰后映射到List

[英]Map to List after filtering on Map's key using Java8 stream

我有一個Map<String, List<String>> 我希望在對地圖的鍵進行過濾后將此地圖轉換為List。

例:

Map<String, List<String>> words = new HashMap<>();
List<String> aList = new ArrayList<>();
aList.add("Apple");
aList.add("Abacus");

List<String> bList = new ArrayList<>();
bList.add("Bus");
bList.add("Blue");
words.put("A", aList);
words.put("B", bList);

給出一個關鍵,比如“B”

Expected Output: ["Bus", "Blue"]

這就是我想要的:

 List<String> wordsForGivenAlphabet = words.entrySet().stream()
    .filter(x-> x.getKey().equalsIgnoreCase(inputAlphabet))
    .map(x->x.getValue())
    .collect(Collectors.toList());

我收到了一個錯誤。 有人可以在Java8中為我提供一種方法嗎?

你的sniplet會生成一個List<List<String>>而不是List<String>

您缺少flatMap ,它會將列表流轉換為單個流,因此基本上會展平您的流:

List<String> wordsForGivenAlphabet = words.entrySet().stream()
    .filter(x-> x.getKey().equalsIgnoreCase(inputAlphabet))
    .map(Map.Entry::getValue)
    .flatMap(List::stream) 
    .collect(Collectors.toList());

如果您不希望重復值,也可以添加distinct()

Federico在他的評論中是正確的,如果您想要的是獲取某個鍵的值(在List )為什么不簡單地進行get (假設您的所有鍵都已經是大寫字母)?

 List<String> values = words.get(inputAlphabet.toUpperCase());

另一方面,如果只是為了理解流操作是如何工作的,還有一種方法可以做到這一點(通過java-9 Collectors.flatMapping

List<String> words2 = words.entrySet().stream()
            .collect(Collectors.filtering(x -> x.getKey().equalsIgnoreCase(inputAlphabet),
                    Collectors.flatMapping(x -> x.getValue().stream(), 
                          Collectors.toList())));

正如之前在collect后告知的那樣,您將獲得List<List<String>>其中只有一個或零值。 您可以使用findFirst而不是collect它將返回Optional<List<String>>

暫無
暫無

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

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