有没有Java 8的方法来填充下面的映射



我有以下Dto类:

@AllArgsConstructor
@ToString
@Getter
public class Dto {
private String cityName;
private String personName;
}

我想创建一个映射<字符串,列表>从上述Dtos列表中选择。逻辑是这样的,所有具有相同城市的Dtos都应该与该城市名称一起列出作为关键字。使用普通foreach可以很容易地完成,但我想知道是否可以使用Java8完成。

可以使用computeInfoAbsent、computeInfoPresent、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);
}
}

最简单的方法是:

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

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

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

最新更新