使用 Java8 流过滤地图键后映射到列表
Map to List after filtering on Map's key using Java8 stream
我有一个Map<String, List<String>>
。我想在过滤地图的键后将这张地图转换为列表。
示例:
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 中为我提供一种方法吗?
您的代码片段将生成 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()
。
如前所述,在 collect
之后,您将得到 List<List<String>>
,其中只有一个或零值。您可以使用 findFirst
而不是 collect
它将 return 您 Optional<List<String>>
.
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())));
我有一个Map<String, List<String>>
。我想在过滤地图的键后将这张地图转换为列表。
示例:
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 中为我提供一种方法吗?
您的代码片段将生成 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()
。
如前所述,在 collect
之后,您将得到 List<List<String>>
,其中只有一个或零值。您可以使用 findFirst
而不是 collect
它将 return 您 Optional<List<String>>
.
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())));