比方说,我有结构的称号描述:
Map<String, Map<String, Car>> mapNeighborhood
包含在分别由地址和板索引的邻域中的所有汽车。我想选择所有的红色汽车重绘他们在黑色。为了完成这个任务,我曾经试图“扁平化”这两个地图和取得使用Java清单8.一旦我得到的名单,应用谓词我只能选择红色轿车和应用重新粉刷。
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相同的,但我认为你可能会失去可读性。
我的问题是:是否有压扁映射到表的另一种更简洁的方式?也许使用flatMap
。提前致谢。
你并不需要一个中间 List
mapNeighborhood.values().stream()
.flatMap(byPlate -> byPlate.values().stream())
.filter(Car::isRed)
.forEach(car -> car.repaint(Color.Black))
我觉得这是两个更比你的代码和更短的可读性。这也是客观得多更加高效,无论是在时间和空间。
还要注意的是Car::isRed
有些奇怪,你将需要为每一个可能的支票Color
上Car
-增加一个新color
的季节,重新实现Car
。
Color::isRed
更有道理,用Car
工具Colored
或一些这样的
interface Colored {
Color getColor();
}
// in Color
public static boolean isRed(Colored colored) {
return Objects.equals(colored.getColor(), RED);
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句