首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用流过滤List<Map<String和String>>

使用流过滤List<Map<String和String>>
EN

Stack Overflow用户
提问于 2019-09-02 17:57:09
回答 2查看 747关注 0票数 0

我需要使用streams通过值过滤列表List<Map<String, String>> (如果map有搜索值,那么map add to list)。我正在尝试这样做:

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-02 18:04:51

如果希望输入List中包含"value2“值的所有Map都出现在输出List中,则需要:

代码语言:javascript
复制
List<Map<String, String>> result = 
    list.stream()
        .filter(map -> map.entrySet().stream().anyMatch (e->e.getValue().equals("value2")))
        .collect(Collectors.toList());

或者(正如厄立特里亚人评论的那样):

代码语言:javascript
复制
List<Map<String, String>> result = 
    list.stream()
        .filter(map -> map.containsValue("value2"))
        .collect(Collectors.toList());
票数 2
EN

Stack Overflow用户

发布于 2019-09-02 20:44:09

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

代码语言:javascript
复制
 list.removeIf(map -> !map.containsValue("value2"));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57754906

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档