使用Stream API获取具有匹配键的映射条目

时间:2018-01-25 13:57:34

标签: java hashmap java-stream

我有一个值数组

String [] str = { ONE, TWO, THREE };

和一些存储在地图中的键值对

Map<String, String> map;

如何使用Stream API从地图中获取其密钥包含在数组中的所有条目?

4 个答案:

答案 0 :(得分:1)

我假设当你说你想要这张地图中的条目时,你的意思是值 所以我会这样做

    String[] str = {"ONE", "TWO", "THREE"};
    Map<String, String> map = <Your map's here>;

    List<String> values = Stream.of(str)
            .filter(map::containsKey)
            .map(map::get)
            .collect(Collectors.toList());

答案 1 :(得分:1)

如果地图和要删除的一组键很小,请从地图的副本开始,然后进行修改。

Map<String, String> filtered = new HashMap<>(map);
filtered.keySet().retainAll(Arrays.asList(str));

如果地图比要移除的地图组大得多,那么制作副本是不受欢迎的,您可以构建一个只有正确条目的新地图:

Set<String> filter = new HashSet<>(Arrays.asList(str));
Map<String, String> filtered = map.entrySet().stream()
    .filter(e -> filter.contains(e.getKey))
    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

答案 2 :(得分:1)

一种方法是流式传输数组并将元素收集到一个新的地图中,其中键是元素,并且每个键都会从地图中获取值:

Map<String, String> result = Arrays.stream(str)
    .collect(Collectors.toMap(e -> e, map::get));

这假定数组的所有元素都是地图中的键,而数组中没有重复的元素。

如果您要过滤掉不是地图键的元素,请在流中使用filter

Map<String, String> result = Arrays.stream(str)
    .filter(map::containsKey)
    .collect(Collectors.toMap(e -> e, map::get));

如果你在数组中有重复的元素:

Map<String, String> result = Arrays.stream(str)
    .filter(map::containsKey)
    .collect(Collectors.toMap(e -> e, map::get, (o, n) -> o));

最后一个参数(o, n) -> o是一个合并函数,当地图上有重复键时,该函数应用于值。在这种情况下,merge函数保留旧值并丢弃新值。

答案 3 :(得分:1)

您没有指定结果的形式。

如果您想要相同的地图但只包含指定的键,则可以使用

Map<String, String> map;
Map<String, String> result = new HashMap<>(map);
result.keySet().retainAll(Arrays.asList(str));

如果不再需要旧状态并且地图是可变的,您可以将第二个语句应用于map而不创建副本。

始终创建新Map的解决方案将是

Map<String, String> result = Arrays.stream(str)
    .collect(HashMap::new, (m, k) -> m.computeIfAbsent(k, map::get), Map::putAll);

如果您只想要一个包含与包含键的数组相对应的值的数组,则可以使用

String[] result = new String[str.length];
Arrays.setAll(result, ix -> map.get(str[ix]));

String[] result = Arrays.stream(str).map(map::get).toArray(String[]::new);