您可以使用流来做到这一点。这将返回包含所需值的每个映射列表的所有键。
Map<String, List<String>> map = new HashMap<>();
map.put("list1", Arrays.asList("Apples", "Oranges", "Bananas"));
map.put("list2", Arrays.asList("Grapes", "Kiwi", "Apples"));
map.put("list3", Arrays.asList("Mangos", "Kiwi", "Berries"));
String val = "Kiwi";
List<String> keys = map.entrySet().stream().filter(
entry -> entry.getValue().contains(val)).map(
entry -> entry.getKey()).collect(Collectors.toList());
System.out.println(keys);
它的工作原理如下:
- 将映射的 entrySet 映射到 entrySet 流。
- 通过检查值(项目列表)来过滤条目值,以查看它是否包含所需的项目。
- 如果是,则将结果映射到该列表的条目键。
- 收集列表中的键。
For the search val of Kiwi
This produces the output [list3, list2]
如果你想在找到第一个条目后停下来,你可以稍微改变一下。
for (String item : List.of("Apples", "Fish")) {
String key = map.entrySet().stream().filter(
entry -> entry.getValue().contains(item)).map(
entry -> entry.getKey()).findFirst().orElse(
"Not Found");
System.out.println("Key for item " + item + " = " + key);
}
这会产生以下输出。
Key for item Apples = list1
Key for item Fish = Key Not Found
这使用findFirst 在找到第一个后停止。由于它返回一个 Optional,orElse 方法可用于指定一个默认值以指示没有列表包含该项目。
您还可以指定并行以使用线程来处理这些流。这可以大大提高处理速度。特别是如果您有多个内核。