Tengo una variedad de temas

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

Quería crear una lista ficticia de usuarios para cada uno de estos temas y agregarlos a un mapa con la clave como tema y el valor como Lista

Algo así como

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

Quería probar esto con Java 8. Acabo de probar algo a continuación, pero no se ve de la manera correcta.

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);
    }
})
2
Apps 10 sep. 2018 a las 16:13

3 respuestas

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

Esta sería una manera si realmente quisiera hacerlo con java-8 y las transmisiones. Una mejora sería tener un método que tome String subjectName y crear ese Entry, por ejemplo:

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

Y úsalo con:

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

Solo tenga en cuenta que su bucle es la forma más limpia de hacerlo OMI

3
Eugene 10 sep. 2018 a las 13:22

Una forma de hacerlo con 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
Federico Peralta Schaffner 10 sep. 2018 a las 13:54

Hagamos esto paso a paso. Primero, el bucle interno para crear 10 usuarios se puede escribir con secuencias como:

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

Y el bucle externo se puede escribir como

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

Y ahora podemos armarlo:

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())
        ));
1
Misha 10 sep. 2018 a las 19:07