使用Java 8将复杂对象列表转换为Map

时间:2018-09-10 13:13:19

标签: java-8 java-stream

我有一系列主题

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

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

类似

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);
    }
})

3 个答案:

答案 0 :(得分:3)

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

如果您真的想使用java-8和流来做到这一点,这将是一种方法。一种改进是使用例如String 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的最简洁方法

答案 1 :(得分:2)

使用Java 8的一种方法:

Map<String,List<User>> userMap = new HashMap<>();

subjects.forEach(s -> {
    for (int i = 0; i < 10; i++) 
        userMap.computeIfAbsent(s, k -> new ArrayList<>())
            .add(new User("first name" + i + subject, "last name" + i + subject));
});

答案 2 :(得分:1)

让我们一次做到这一步。首先,可以使用以下流编写用于创建10个用户的内部循环:

import static java.util.stream.Collectors.toList;
import static java.util.stream.Collectors.toMap;


List<User> userList = IntStream.range(0, 10)
    .mapToObj(i -> new User("first name" + i + subject, "last name" + i + subject)
    .collect(toList());

外循环可以写成

subjects.stream()
    .collect(toMap(
        subject -> subject,   // key for the map is the subject
        subject -> ...        // whatever should be the value of the map
    ));

现在我们可以将其放在一起:

Map<String, List<User>> userMap = subjects.stream()
        .collect(toMap(
                subject -> subject,
                subject -> IntStream.range(0, 10)
                        .mapToObj(i -> new User("first name" + i + subject, "last name" + i + subject))
                        .collect(toList())
        ));