我需要使用streams通过值过滤列表List<Map<String, String>> (如果map有搜索值,那么map add to list)。我正在尝试这样做:
static Map<String, String> map1 = new HashMap<>();
static Map<String, String> map2 = new HashMap<>();
static Map<String, String> map3 = new HashMap<>();
static {
map1.put("key", "value");
map1.put("key2", "value2");
map2.put("key3", "value3");
map2.put("key2", "value2");
map3.put("key3", "value3");
map3.put("key4", "value4");
}
public static void main(String[] args) {
List<Map<String, String>> list = new ArrayList<>();
Map<String, String> resultMap = new HashMap<>();
list.add(map1);
list.add(map2);
list.add(map3);
List<Map<String, String>> result = list.stream()
.flatMap(map -> map.entrySet().stream())
.filter(value -> value.getValue().equals("value2"))
.map(x -> resultMap.put(x.getKey(), x.getValue()))
.collect(Collectors.toList());
}对于执行这段代码,我有错误: java:不兼容的类型:推断变量T具有不兼容的界限等式约束: java.util.Map下限: java.lang.String
发布于 2019-09-02 18:04:51
如果希望输入List中包含"value2“值的所有Map都出现在输出List中,则需要:
List<Map<String, String>> result =
list.stream()
.filter(map -> map.entrySet().stream().anyMatch (e->e.getValue().equals("value2")))
.collect(Collectors.toList());或者(正如厄立特里亚人评论的那样):
List<Map<String, String>> result =
list.stream()
.filter(map -> map.containsValue("value2"))
.collect(Collectors.toList());发布于 2019-09-02 20:44:09
另一个快速解决方案是removeIf函数。具有重用相同列表对象的优点。
list.removeIf(map -> !map.containsValue("value2"));https://stackoverflow.com/questions/57754906
复制相似问题