java - Java 8 列表到地图的转换
问题描述
我在将列表对象转换为映射字符串、列表对象时遇到问题。我正在寻找带有汽车中所有组件的键名的 Map,并且一个值由具有此组件的汽车表示
public class Car {
private String model;
private List<String> components;
// getters and setters
}
我写了一个解决方案,但正在寻找一个更好的流解决方案。
public Map<String, List<Car>> componentsInCar() {
HashSet<String> components = new HashSet<>();
cars.stream().forEach(x -> x.getComponents().stream().forEachOrdered(components::add));
Map<String, List<Car>> mapCarsComponents = new HashMap<>();
for (String keys : components) {
mapCarsComponents.put(keys,
cars.stream().filter(c -> c.getComponents().contains(keys)).collect(Collectors.toList()));
}
return mapCarsComponents;
}
解决方案
您也可以使用流来做到这一点,但我发现这更具可读性:
public static Map<String, List<Car>> componentsInCar(List<Car> cars) {
Map<String, List<Car>> result = new HashMap<>();
cars.forEach(car -> {
car.getComponents().forEach(comp -> {
result.computeIfAbsent(comp, ignoreMe -> new ArrayList<>()).add(car);
});
});
return result;
}
或使用流:
public static Map<String, List<Car>> componentsInCar(List<Car> cars) {
return cars.stream()
.flatMap(car -> car.getComponents().stream().distinct().map(comp -> new SimpleEntry<>(comp, car)))
.collect(Collectors.groupingBy(
Entry::getKey,
Collectors.mapping(Entry::getValue, Collectors.toList())
));
}
推荐阅读
- next.js - NextJS 使用 SSR 和 Styled-Components 构建错误
- html - CSS网格,折叠一个单元格,然后使下一行中的一个上升
- php - PHP in_array() 函数中的错误,它没有返回所需的值
- android - 调用需要 FLAG_ACTIVITY_NEW_TASK 的 startActivity()
- reactjs - 尝试显示来自 React 服务器的错误时如何修复错误?
- go - SMTP 返回不同值的消息
- php - 如何使用 php 从 Cpanel 发送邮件
- php - 即使我设置了环境变量,ECS Fargate 上的 laravel 也只显示 500
- python - 如何停止python以完成一个操作的执行然后启动其他进程
- c# - Distinct 上不调用 IEqualityComparer