如何使用Lamda表达式Java 8过滤两张地图并制作第三张地图

时间:2019-09-12 19:24:02

标签: java collections java-8 hashmap java-stream

Map<String,String> persons = new HashMap<>();
persons.put("aaaa@testing","123456789");
persons.put("bbbb@testing","987654321");

Map<String,UsersDTO> users = new HashMap<>();
users.put("aaaa@testing", UsersDTO1);
users.put("bbbb@testing",UsersDTO2);

//Below one is the my required final map by using above two maps by using java 8 Lambdas
Map<String,UsersDTO> finalMap = new HashMap<>();
finalMap.put("123456789",UsersDTO1);
finalMap.put("987654321",UsersDTO2);

如何通过使用以上两张地图制作finalMap?这类问题可能在那里,但我想对此特别关注,所以这就是我要发布的原因。如何使用lambda表达式进行制作?

2 个答案:

答案 0 :(得分:4)

您可以这样做,但请注意,您会得到一个Map<String,UserDto>

Map<String,UsersDTO> finalMap =
        persons.entrySet().stream()
                .collect(Collectors.toMap(Map.Entry::getValue, e-> users.get(e.getKey())));

如安德烈亚斯(Andreas)所建议,如果电子邮件在两张地图之间不匹配,则可以处理这种情况。例如,忽略条目:

Map<String, UsersDTO> finalMap =
        persons.entrySet().stream()
                .filter(e -> users.containsKey(e.getKey()))
                .collect(Collectors.toMap(Map.Entry::getValue, e -> users.get(e.getKey())));

答案 1 :(得分:1)

我认为您的意思是这样的:

Map<String, UsersDTO> finalMap = users.entrySet().stream()
        .collect(Collectors.toMap(user -> persons.get(user.getKey()), Map.Entry::getValue));

这是预期结果的简单ideone demo


如Andreas所评论,您需要另一个过滤器以确保每个条目都具有匹配的内容:

Map<String, UsersDTO> finalMap = users.entrySet().stream()
        .filter(user -> persons.containsKey(user.getKey()))
        .collect(Collectors.toMap(user -> persons.get(user.getKey()), Map.Entry::getValue));