Список Java 8 <Foo>для отображения <String, Map <String, List <String>>> - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть следующий класс:

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

Теперь я хочу преобразовать List<Foo> в Map<String, Map<String, List<String>>>. Я нашел этот ответ , который помог мне разработать следующий код:

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

Единственная проблема с этим кодом - это часть, в которой он должен преобразовываться в List<String>. Я не мог найти способ конвертировать Foo в List в этой части.

Другой подход, который приводит к 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())));

Что мне нужно изменить, чтобы получить Map<String, Map<String, List<String>>> от List<Foo>?

1 Ответ

0 голосов
/ 01 ноября 2018

Чтобы получить List другого типа, чем тип элементов Stream, вы должны связать Collectors.mapping коллектор с 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()))));
...