地图<字符串,地图<字符串,租车>>到列表<汽车>使用Java 8

RubioRic:

比方说,我有结构的称号描述:

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有些奇怪,你将需要为每一个可能的支票ColorCar-增加一个新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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章