如何基于2个值从地图中过滤文档并创建另一个地图

时间:2019-08-02 14:07:45

标签: java hashmap java-stream

我对Java 8语法及其流API不太熟悉,并试图在map上实现一些复杂的过滤。

下面是我的代码,使用了传统的地图循环和过滤功能。

public class HashMapFilter {

    public static void main(String[] args) {
        HashMap<String, Map<String, String>> map = new HashMap<String, Map<String, String>>();

        Map<String,String> foo = new HashMap<>();
        foo.put("lang", "en");
        foo.put("type", "msg");
        foo.put("location", "usa");
        map.put("1", foo);

        Map<String,String> bar = new HashMap<>();
        bar.put("lang", "en");
        bar.put("type", "user");
        bar.put("location", "usa");
        map.put("2", bar);

        Map<String,String> baz = new HashMap<>();
        baz.put("lang", "en");
        baz.put("type", "msg");
        baz.put("location", "usa");
        map.put("3", baz);

        HashMap<String, Map<String, String>> filteredMap = new HashMap<String, Map<String, String>>();

        for(Map.Entry<String, Map<String, String>> entry : map.entrySet()) {
            Map<String, String> innerMap = entry.getValue();
            if(innerMap.get("lang").equals("en") && innerMap.get("type").equals("msg")) {
                filteredMap.put(entry.getKey(),innerMap);
            }
        }

        System.out.println("Size of filtered map : "+ filteredMap.size());
    }
}

如您所见,我只想基于langtype过滤内部映射,但是使用传统方式的代码非常复杂,并且我敢肯定,可以使用轻松地对其进行重写Java 8流API。 注意:如我的示例所示,过滤后的地图将仅包含2个内部地图,因为只有2个同时具有lang=entype=msg的地图。

1 个答案:

答案 0 :(得分:1)

几乎相同,只是在filter中添加该条件,然后使用Collectors.toMap收集到Map

Map<String, Map<String, String>> filteredMap = map.entrySet()
                                                  .stream()
                                                  .filter(entry->entry.getValue().get("lang").equals("en") && entry.getValue().get("type").equals("msg"))
                                                  .collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue));