java - Map<String, Map<String, Car>> 到 List<Car> 使用 Java 8

标签 java java-8 flatten

假设我有标题中描述的结构:

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/

相关文章:

python - 展平不规则(任意嵌套)的列表列表

java - 关于双参数方法引用的困惑

java - 通过某个键将 <Long, List<String>> 映射到字符串 Lambda 列表

python - 尝试将 Reddit JSON 扁平化为许多 "conversations"

java - JSplitPane:有没有办法显示/隐藏其中一个 Pane ?

java - Android VM 堆大小

java - Play Java 中的 @With 注解

java - Android onBackPressed() 没有被调用?

lambda - List<Base> 到 List<Long> ... 条件转换

javascript - 如何展平夹紧的阵列