使用Java 8将Map <string,map <string,=“” car =“” >>映射到List <car>

时间:2019-05-14 05:57:30

标签: java java-8 flatten

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

request.session['username'] = username

request.session['email'] = email

,包含附近分别由地址和车牌索引的所有汽车。 我要选择所有红色汽车以黑色重新粉刷。为了完成该任务,我尝试使用Java 8来“平展”两个Map并获得一个List。一旦获得List,则应用谓词后,我只能选择红色汽车并进行重新绘制。

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)); 。预先感谢。

4 个答案:

答案 0 :(得分:9)

您不需要中间的List

mapNeighborhood.values().stream()
                        .flatMap(byPlate -> byPlate.values().stream())
                        .filter(Car::isRed)
                        .forEach(car -> car.repaint(Color.Black))

我认为这比代码更易读,而且更短。客观上,它在时间和空间上都高效


还请注意,Car::isRed有点奇怪,因为您需要检查Color上所有可能的Car-为季节添加新的color,重新实现{{ 1}}。

Car更有意义,使用Color::isRed实现Car或类似的

Colored

答案 1 :(得分:3)

我的结果与@Boris相同,但我将向您展示如何使用IntelliJ实现它:

for (Map<String, Car> value : mapNeighborhood.values()) {
    for (Car car : value.values()) {
        if (car.isRed()) {
            car.repaint(Color.BLACK);
        }
    }
}

然后将光标移到第一个“ for”单词中,按Alt-Enter,然后选择“用ForEach替换”,tada,我们开始:

mapNeighborhood.values().stream()
                        .flatMap(value -> value.values().stream())
                        .filter(Car::isRed)
                        .forEach(car -> car.repaint(Color.BLACK));

在任何循环中,您都可以尝试使用IntelliJ帮助您智能地转换为Java 8样式

答案 2 :(得分:0)

这是我尝试过的一种方式

List<Car> collect = mapNeighborhood.values().stream()
                                            .map(Map::values)
                                            .flatMap(Collection::stream)
                                            .collect(Collectors.toList());

然后,您可以继续操作汽车列表。

答案 3 :(得分:0)

这可能会有所帮助。

library(lubridate)
datetime <- ymd_hms("2015-07-20T16:33:59.158Z")
datetime + 24*60*60
[1] "2015-07-21 16:33:59 UTC"