假设我具有标题中描述的结构:
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));
。预先感谢。
答案 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"