Преобразование списка сложных объектов в карту с использованием Java 8 - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть массив предметов

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

Ответы [ 3 ]

0 голосов
/ 10 сентября 2018

Один из способов сделать это с 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));
});
0 голосов
/ 10 сентября 2018

Давайте сделаем это по одному шагу за раз. Во-первых, внутренний цикл для создания 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())
        ));
0 голосов
/ 10 сентября 2018
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

...