如何在Java 8中将对象列表转换为映射?

时间:2018-10-19 10:10:40

标签: list collections java-8 set java-stream

我正在尝试使用流在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 :(得分:3)

您可以像这样使用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>

答案 1 :(得分:2)

我们可以按getPart()分组,然后返回Map<Integer, Set<String>>

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

答案 2 :(得分:1)

通过第一个字段对流进行简单分组并转换组看起来像这样:

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