假设我有标题中描述的结构:
Map<String, Map<String, Car>> mapNeighborhood
包含分别由地址和车牌索引的邻域中的所有汽车。 我想选择所有红色汽车将它们重新涂成黑色。为完成该任务,我尝试使用 Java 8 将两个 map “扁平化”并获得一个列表。获得列表后,应用谓词我可以仅选择红色汽车并应用重绘。
List<Car> listCars = new ArrayList<Car>();
mapNeighborhood.values().forEach(map -> map.values()
.forEach(car -> listCars.add(car)));
listCars.stream().filter(Car::isRed)
.forEach(car -> car.repaint(Color.Black));
我确信您可以在 Java 8 中仅使用一行来实现相同的目的,但我认为您可能会失去可读性。
我的问题是:是否有另一种不那么冗长的方法将 map 展平为列表?也许使用 flatMap
。提前致谢。
最佳答案
你不需要中间的 List
mapNeighborhood.values().stream()
.flatMap(byPlate -> byPlate.values().stream())
.filter(Car::isRed)
.forEach(car -> car.repaint(Color.Black))
我认为这比您的代码可读性更高,而且更短。客观上,它在时间和空间上也多更有效率。
还要注意 Car::isRed
有点奇怪,因为您需要检查 Car
上所有可能的 Color
- 添加一个新的color
为季节,重新实现 Car
。
Color::isRed
更有意义,Car
实现了 Colored
或类似的东西
interface Colored {
Color getColor();
}
// in Color
public static boolean isRed(Colored colored) {
return Objects.equals(colored.getColor(), RED);
}
关于java - Map<String, Map<String, Car>> 到 List<Car> 使用 Java 8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56123855/