假设我们有两个 ArrayList,分别代表两个对象,并且两个对象都填充了东西。为了便于理解,一个是车牌的ArrayList,另一个是汽车的ArrayList。
所有汽车都被分配一个有效的车牌,然后汽车获得车牌号码......
cars.addAll(plates.stream().filter(plate -> plate.getStatus() == PLATE_GOOD)
.map(plate -> new Car(plate.getNumber(), modelT())).collect(Collectors.toList()));
但是车主需要将他们的车牌和汽车登记到车牌和汽车 map 中。
registered = new HashMap<Plate, Car>();
for(Plate plate : plates)
if(plate.getStatus() == PLATE_GOOD)
for(Car car : cars)
if(car.getNumber() == plate.getNumber()) {
registered.put(plate, car);
break;
}
但 DMV 要求不得出现循环,并且车主应使用对方付费电话。
TL;DR Collect 调用具有多个谓词以填充对象映射?
最佳答案
您无法通过已使用的语句获得所需的内容,因为它会生成 Car
的列表。 ,但 Car
之间没有任何联系和 Plate
。两者都有车牌号,但这并不能让您找出 Plate
如果您有Car
,反之亦然,无需经历您发布的那种双循环,或者无需设置 Map
将车牌号映射到车牌或汽车。但如果您需要Map<Plate, Car>
,您不必设置 Map<String, Plate>
或Map<String, Car>
[假设车牌号是一个字符串],尽管该 map 无论如何都是有用的。
我建议创建 Map<Plate, Car>
第一:
Map<Plate, Car> carMap = plates.stream().filter(plate -> plate.getStatus() == PLATE_GOOD)
.collect(Collectors.toMap(Function.identity(), plate -> new Car(plate.getNumber(), modelT())));
这将创建一个新的 Car
为每个板 block 和设置 map 。 Collectors.toMap()
需要两个参数,它们是在 Plate
上运行的函数。第一个将成为映射的键,第二个将成为值。 Function.identity()
只是意味着我们使用 Plate
本身作为 key 。或者您也可以等效地使用 plate -> plate
.
要获取汽车列表,请使用carMap.values()
。这将返回 Collection
(不一定是 List
),但您可以使用 addAll
将其添加到列表中。这不一定会按照与车牌相同的顺序返回汽车。如果您需要以相同的顺序排列它们,您可以在创建 carMap
后执行此操作:
List<Car> carList = plates.stream().filter(plate -> plate.getStatus() == PLATE_GOOD)
.map(plate -> carMap.get(plate)).collect(Collectors.toList()));
我不知道有什么方法可以同时执行这两项操作(将汽车添加到列表中,并将车牌/汽车添加到 map 中),除非编写自己的代码来添加到列表和 map 中:
plates.stream().filter(plate -> plate.getStatus() == PLATE_GOOD)
.forEachOrdered(plate -> {
Car car = new Car(plate.getNumber(), modelT());
carList.add(car);
carMap.put(plate, car); });
forEachOrdered
需要确保操作按正确的顺序执行。 注意:我还没有测试过最后一个。我认为无需同步即可工作,但我不确定。
关于java - 对方付费电话要 map 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37245094/