使用流来查找最高的唯一值

时间:2017-07-03 10:02:08

标签: java java-stream

让我说我有这个简单的Car对象:

class Car {
  String id;
  String model;
  Integer price;  
}

现在我有一个可能如此的汽车列表:

{ Car(1, Commodore, 55000), Car(2, F150, 120000), Car(3, F150, 130000),
  Car(4, Camry, 50000), Car(5,Commodore,50000)}

我想从列表中筛选出任何重复的模型,确保我只保留每个副本中价格最贵的汽车,例如:

{ Car(1, Commodore, 55000), Car(3, F150, 130000), Car(4, Camry, 50000) }

我相信我可以使用Streams API执行此操作,但我只是在努力将正确的调用链接在一起。

在我的脑海中,我会想象伪代码会是这样的:

  • 按型号收集所有车辆
  • 在每个单独的模型列表上使用Collectors.maxBy()以获得最昂贵的
  • 将生成的单项目列表再次合并为全球车辆列表

尝试将它们拼接在一起有点混乱 - 任何想法?

2 个答案:

答案 0 :(得分:2)

您可以按型号创建最高价值汽车的Map

List<Car> cars = new ArrayList<> ();
Map<String,Optional<Car>> maxCarByModel =
  cars.stream ()
      .collect (Collectors.groupingBy (c -> c.model,
                                       Collectors.maxBy (Comparator.comparing (c->c.price))));

答案 1 :(得分:1)

使用Collectors.toMap合并功能,使汽车保持最高价格:

Collection<Car> carsWithMaxPrice = cars.stream().collect(Collectors.toMap(
        Car::getModel,
        Function.identity(),
        (c1, c2) -> c1.getPrice() > c2.getPrice() ? c1 : c2))
    .values();