我有一个值数组
String [] str = { ONE, TWO, THREE };
和一些存储在地图中的键值对
Map<String, String> map;
如何使用Stream API从地图中获取其密钥包含在数组中的所有条目?
答案 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);