我对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());
}
}
如您所见,我只想基于lang
和type
过滤内部映射,但是使用传统方式的代码非常复杂,并且我敢肯定,可以使用轻松地对其进行重写Java 8流API。
注意:如我的示例所示,过滤后的地图将仅包含2个内部地图,因为只有2个同时具有lang=en
和type=msg
的地图。
答案 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));