首页 > 解决方案 > 使用 Java 8 将复杂对象列表转换为 Map

问题描述

我有一系列主题

List<String> subjects = Arrays.asList(“physics”, “maths”);

我想为每个主题创建一个虚拟用户列表,并将它们添加到地图中,键为主题,值为列表

就像是

Map<String,List<User>> userMap = new HashMap<>();
for(String subject: subjects){
    List<User> users = new ArrayList<User>();
    for(int i=0;i<10;i++){
        User user = new User(“first name”+i+subject,”last name”+i+subject);
        users.add(user);
    } 
    userMap.put(subject,users);
}

我想用 Java 8 试试这个。刚刚在下面尝试了一些东西,但看起来不是正确的方法。

subjects.stream().map((subjectName)->{
    List<User> userList = new ArrayList<User>();
    for(int i=0;i<10;i++){
        User user = new User(“first name”+i+subject,”last name”+i+subject);
        userList.add(user);
    }
})

标签: java-8java-stream

解决方案


subjects.stream()
        .map(subjectName -> {
            List<User> users = .... create the users;
            return new SimpleEntry<>(subjectName, users);
        })
        .collect(Collectors.toMap(Entry::getKey, Entry::getValue))

如果你真的想用java-8和流来做这件事,这将是一种方法。一个改进是拥有一种方法,该方法采用 aString subjectName并创建它Entry,例如:

private static Entry<String, List<User>> createEntry(String subjectName) {
    List<User> users = .... create the user;
    return new SimpleEntry<>(subjectName, users);
}

并将其用于:

subjects.stream()
        .map(YourClass::createEntry)
        .collect(Collectors.toMap(Entry::getKey, Entry::getValue))

请注意,您的循环最干净的方式 IMO


推荐阅读