Mam następującą klasę:

public class Foo {
    private String areaName;
    private String objectName;
    private String lineName;
}

Teraz chcę przekonwertować List<Foo> na Map<String, Map<String, List<String>>>. Znalazłem tę odpowiedź, która pomogła mi opracować następujący kod:

Map<String, Map<String, List<String>>> testMap = foos.stream().collect(Collectors.groupingBy(e -> e.getAreaName(),
        Collectors.groupingBy(e -> e.getObjectName(), Collectors.collectingAndThen(Collectors.toList(),
                e -> e.stream().map(f -> f.getLineName())))));

Jedyny problem z tym kodem to część, w której powinien zostać przekonwertowany na List<String>. Nie mogłem znaleźć sposobu na przekonwertowanie Foo na List w tej części.

Inne podejście, które skutkuje Map<String, Map<String, List<Foo>>>:

Map<Object, Map<Object, List<Foo>>> testMap = ventures.stream().collect(Collectors.groupingBy(e -> e.getAreaName(),
        Collectors.groupingBy(e -> e.getObjectName(), Collectors.toList())));

Co muszę zmienić, aby otrzymać Map<String, Map<String, List<String>>> od List<Foo>?

7
XtremeBaumer 1 listopad 2018, 15:17

1 odpowiedź

Najlepsza odpowiedź

Aby uzyskać List innego typu niż typ elementów Stream, powinieneś połączyć kolektor Collectors.mapping z groupingBy:

Map<String, Map<String, List<String>>> testMap = 
    foos.stream()
        .collect(Collectors.groupingBy(Foo::getAreaName,
                                       Collectors.groupingBy(Foo::getObjectName,
                                                             Collectors.mapping(Foo::getLineName,
                                                                                Collectors.toList()))));
13
Eran 1 listopad 2018, 15:25