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