对方付费地图?
Collect call for a Map?
所以假设我们有两个 ArrayLists 用于两个对象,这两个对象都填充了东西。为了便于理解,一个是车牌的ArrayList,一个是汽车的ArrayList。
所有汽车都分配了有效的车牌,然后汽车获得了车牌号...
cars.addAll(plates.stream().filter(plate -> plate.getStatus() == PLATE_GOOD)
.map(plate -> new Car(plate.getNumber(), modelT())).collect(Collectors.toList()));
但随后车主需要将他们的车牌和汽车登记到车牌和汽车地图中。
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
和 [=15] 之间没有联系=].两者都有一个车牌号,但是如果你有一个 Car
,那你就无法计算出 Plate
,反之亦然,而不需要通过你发布的那种双循环——或者不设置将车牌号映射到车牌或汽车的 Map
。但是,如果您需要 Map<Plate, Car>
,则不必设置 Map<String, Plate>
或 Map<String, Car>
[假设车牌号是一个字符串],尽管该映射可能对反正都有。
我建议先创建 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
和设置地图。 Collectors.toMap()
需要两个参数,它们是在 Plate
上运行的函数。第一个将成为地图的键,第二个将成为值。 Function.identity()
只是意味着我们使用 Plate
本身作为密钥。或者你可以等效地使用 plate -> plate
.
要获取汽车列表,请使用 carMap.values()
。此 return 是 Collection
(不一定是 List
),但您可以使用 addAll
将其添加到列表中。这不一定 return 汽车与车牌的顺序相同。如果您需要它们的顺序相同,您可以在创建 carMap
:
之后执行此操作
List<Car> carList = plates.stream().filter(plate -> plate.getStatus() == PLATE_GOOD)
.map(plate -> carMap.get(plate)).collect(Collectors.toList()));
我不知道有什么方法可以同时执行这两项操作(将汽车添加到列表中,并将 plate/car 添加到地图中),除非编写自己的代码以添加到列表中和地图:
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
以确保以正确的顺序执行操作。 注意:我还没有测试最后一个。我认为它可以在没有同步的情况下工作,但我不确定。
所以假设我们有两个 ArrayLists 用于两个对象,这两个对象都填充了东西。为了便于理解,一个是车牌的ArrayList,一个是汽车的ArrayList。
所有汽车都分配了有效的车牌,然后汽车获得了车牌号...
cars.addAll(plates.stream().filter(plate -> plate.getStatus() == PLATE_GOOD)
.map(plate -> new Car(plate.getNumber(), modelT())).collect(Collectors.toList()));
但随后车主需要将他们的车牌和汽车登记到车牌和汽车地图中。
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
和 [=15] 之间没有联系=].两者都有一个车牌号,但是如果你有一个 Car
,那你就无法计算出 Plate
,反之亦然,而不需要通过你发布的那种双循环——或者不设置将车牌号映射到车牌或汽车的 Map
。但是,如果您需要 Map<Plate, Car>
,则不必设置 Map<String, Plate>
或 Map<String, Car>
[假设车牌号是一个字符串],尽管该映射可能对反正都有。
我建议先创建 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
和设置地图。 Collectors.toMap()
需要两个参数,它们是在 Plate
上运行的函数。第一个将成为地图的键,第二个将成为值。 Function.identity()
只是意味着我们使用 Plate
本身作为密钥。或者你可以等效地使用 plate -> plate
.
要获取汽车列表,请使用 carMap.values()
。此 return 是 Collection
(不一定是 List
),但您可以使用 addAll
将其添加到列表中。这不一定 return 汽车与车牌的顺序相同。如果您需要它们的顺序相同,您可以在创建 carMap
:
List<Car> carList = plates.stream().filter(plate -> plate.getStatus() == PLATE_GOOD)
.map(plate -> carMap.get(plate)).collect(Collectors.toList()));
我不知道有什么方法可以同时执行这两项操作(将汽车添加到列表中,并将 plate/car 添加到地图中),除非编写自己的代码以添加到列表中和地图:
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
以确保以正确的顺序执行操作。 注意:我还没有测试最后一个。我认为它可以在没有同步的情况下工作,但我不确定。