Как преобразовать список объектов в карту в Java 8? - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь научиться делать это в Java 8 с использованием потоков.

Учитывая следующее:

List<PartModel> models = new ArrayList<>();
models.add(new PartModel("Part1", "AModel"));
models.add(new PartModel("Part1", "BModel"));
models.add(new PartModel("Part2", "AModel"));

Я хотел бы преобразовать этот список в карту: Map<String, Set<String>где значения будут:

"Part1" -> ["AModel", "BModel"]
"Part2" -> ["AModel"]

Как этого добиться с помощью потока Java 8?

Ответы [ 3 ]

0 голосов
/ 19 октября 2018

Вы можете использовать коллектор groupingBy следующим образом:

Map<String, Set<String>> partModelMap = models.stream()
      .collect(Collectors.groupingBy(Partmodel::getPart,
               Collectors.mapping(Partmodel::getModel, Collectors.toSet())));

Часть Collectors.mapping отобразит значения карты от List<PartModel> до Set<String>.

0 голосов
/ 19 октября 2018

Простая группировка потоков по первому полю и преобразование групп может выглядеть следующим образом:

    Map<String, String[]> map = models.stream()
        .collect(Collectors.groupingBy(PartModel::getPartName,
                Collectors.mapping(PartModel::getModelName, Collectors.toList())))
        .entrySet().stream()
        .collect(Collectors.toMap(Entry::getKey, 
        entry -> entry.getValue().toArray(new String[entry.getValue().size()])));
0 голосов
/ 19 октября 2018

Мы можем сгруппировать по getPart() и затем вернуть Map<Integer, Set<String>>

Map<Integer, Set<String>> collect = models.stream()
                .collect(Collectors.groupingBy(PartModel::getPart, 
                Collectors.mapping(PartModel::getModel), Collectors.toSet())));
...