如何使用java流过滤地图的地图
如何使用java流过滤映射的映射。我可以用双环来做,但我认为这不是有效的如何使用java流过滤地图的地图,java,java-stream,Java,Java Stream,如何使用java流过滤映射的映射。我可以用双环来做,但我认为这不是有效的 public class MapUsage { static Map<Integer, Map<Integer, String>> parentMap = new HashMap<>(); static Map<String, String> userRole = new HashMap<>(); public static void m
public class MapUsage {
static Map<Integer, Map<Integer, String>> parentMap = new HashMap<>();
static Map<String, String> userRole = new HashMap<>();
public static void main(String ... args){
initializeData();
displayMapForUser("user1", parentMap);
// printMap(parentMap);
}
private static void displayMapForUser(String user1, Map<Integer, Map<Integer, String>> parentMap) {
Integer role = new Integer(userRole.get(user1));
Map<Integer, Map<Integer, String>> userMap = new HashMap<>();
Map<Integer, String> childMap = new HashMap<>();
for(Map.Entry<Integer, Map<Integer, String >> entry : parentMap.entrySet()){
for(Map.Entry<Integer, String > entry1: entry.getValue().entrySet()){
if(entry1.getKey().equals(role))
childMap.put(entry1.getKey(), entry1.getValue());
}
userMap.put(entry.getKey(), childMap);
}
printMap(userMap);
}
private static void printMap(Map<Integer, Map<Integer, String>> parentMap) {
for(Map.Entry<Integer, Map<Integer,String> > entry: parentMap.entrySet()){
System.out.println("key: "+entry.getKey());
System.out.println("value: "+entry.getValue());
}
}
private static void initializeData() {
Map<Integer, String > childMap1 = new HashMap<>();
Map<Integer, String > childMap2 = new HashMap<>();
userRole.put("user1", "1");
userRole.put("user2", "2");
userRole.put("user3", "3");
userRole.put("user4", "4");
childMap1.put(1, "one");
childMap1.put(2, "two");
childMap1.put(3, "three");
childMap1.put(4, "four");
parentMap.put(1, childMap1);
childMap2.put(1, "one");
childMap2.put(2, "two");
childMap2.put(3, "three");
parentMap.put(2, childMap2);
}
}
您可以使用收集器.toMap作为:
Map<Integer, Map<Integer, String>> userMap = parentMap.entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey, entry -> entry.getValue()
.entrySet().stream()
.filter(en -> en.getKey().equals(role))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue))));
Map userMap=parentMap.entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey,Entry->Entry.getValue()
.entrySet().stream()
.filter(en->en.getKey().equals(角色))
.collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue));
但请注意,您在这里并没有获得显著的性能效率。只要可读性好,你就可以这样写:
Map<Integer, Map<Integer, String>> usersMap = new HashMap<>(parentMap);
usersMap.values().forEach(innerMap -> innerMap.entrySet().removeIf(en -> !en.getKey().equals(role)));
Map usersMap=newhashmap(parentMap);
usersMap.values().forEach(innerMap->innerMap.entrySet().removeIf(en->!en.getKey().equals(role));
您使用的是什么版本的Java?@Wiingreen-Java 8“过滤器”是什么意思?是否仅包括符合某些标准的第二个映射的成员?是。我想根据用户的角色返回内部映射的结果。我想指出,这与原始解决方案的复杂性大致相同,但可读性的提高是一个很好的改进。
Map<Integer, Map<Integer, String>> usersMap = new HashMap<>(parentMap);
usersMap.values().forEach(innerMap -> innerMap.entrySet().removeIf(en -> !en.getKey().equals(role)));