基于键列表获取子哈希映射的最佳方法是什么?

2022-09-01 08:20:17

我有一个HashMap,我想得到一个新的HashMap,它只包含第一个HashMap中的元素,其中K属于特定列表。

我可以查看所有键并填充新的HashMap,但我想知道是否有更有效的方法可以做到这一点?

谢谢


答案 1

使用Java8流,有一个功能性(优雅)的解决方案。if 是要保留的键的列表,并且是源 。keysmapMap

keys.stream()
    .filter(map::containsKey)
    .collect(Collectors.toMap(Function.identity(), map::get));

完整示例:

    List<Integer> keys = new ArrayList<>();
    keys.add(2);
    keys.add(3);
    keys.add(42); // this key is not in the map

    Map<Integer, String> map = new HashMap<>();
    map.put(1, "foo");
    map.put(2, "bar");
    map.put(3, "fizz");
    map.put(4, "buz");

    Map<Integer, String> res = keys.stream()
        .filter(map::containsKey)
        .collect(Collectors.toMap(Function.identity(), map::get));

    System.out.println(res.toString());

指纹:{2=bar, 3=fizz}

EDIT 为地图中缺少的键添加filter


答案 2

是的,有一个解决方案:

Map<K,V> myMap = ...;
List<K> keysToRetain = ...;
myMap.keySet().retainAll(keysToRetain);

对 上的操作将更新基础地图。请参阅 java 文档retainAllSet

编辑请注意,此解决方案可修改 .Map