是否有 Java 8 方法来填充以下地图?

bob*_*bob 0 java java-8 java-stream

我有以下 Dto 类:

@AllArgsConstructor
@ToString
@Getter
public class Dto {
    private String cityName;
    private String personName;
}
Run Code Online (Sandbox Code Playgroud)

我想从上面的 Dtos 列表创建一个 Map<String, List>。逻辑是这样的,所有具有相同城市的Dto都应该以该城市名称作为关键字一起列出。可以使用普通的 foreach 轻松完成,但我想知道这是否可以使用 Java 8 完成。

可以使用computeIfAbsent、computeIfPresent、stream.collect(toMap())等来做些什么吗?

public class Runner {
    public static void main(String[] args) {
        Map<String, List<Dto>> map = new HashMap<>();
        List<Dto> tempList = null;

        List<Dto> dtos = Arrays.asList(
                new Dto("Indore", "A"),
                new Dto("Indore", "B"),
                new Dto("Pune", "C"),
                new Dto("Pune", "D")
        );

        for (Dto dto : dtos) {
            if(map.containsKey(dto.getCityName())) {
                map.get(dto.getCityName()).add(dto);
            }
            else {
                tempList = new ArrayList<>();
                tempList.add(dto);
                map.put(dto.getCityName(), tempList);
            }
        }

        System.out.println(map);
    }
}
Run Code Online (Sandbox Code Playgroud)

And*_*ner 8

最简单的方法是:

Map<String, List<Dto>> map = dtos.stream().collect(Collectors.groupingBy(Dto::getCityName));
Run Code Online (Sandbox Code Playgroud)

与您当前的代码最相似的方式是:

for (Dto dto : dtos) {
  map.computeIfAbsent(dto.getCityName(), k -> new ArrayList<>()).add(dto);
}
Run Code Online (Sandbox Code Playgroud)