使用流过滤List <Map <String,String >>

时间:2019-09-02 09:57:09

标签: java java-stream

我需要使用流按值(如果地图已搜索值,然后将地图添加到列表)过滤列表List<Map<String, String>>。我正在尝试这样做:

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

2 个答案:

答案 0 :(得分:2)

如果您希望包含{value2“值的输入Map的所有List出现在输出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());

答案 1 :(得分:0)

另一个快速解决方案是removeIf函数。具有重用同一列表对象的优点。

 list.removeIf(map -> !map.containsValue("value2"));