对方付费地图?

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 以确保以正确的顺序执行操作。 注意:我还没有测试最后一个。我认为它可以在没有同步的情况下工作,但我不确定。