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)
最简单的方法是:
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)
| 归档时间: |
|
| 查看次数: |
95 次 |
| 最近记录: |