【问题标题】:Using streams to find the highest unique values使用流查找最高的唯一值
【发布时间】:2017-12-06 13:21:03
【问题描述】:

假设我有一个简单的 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() 以获得最昂贵的
  • 再次将生成的单项列表合并到全局汽车列表中

虽然尝试将它们拼接起来有点混乱 - 有什么想法吗?

【问题讨论】:

  • List<Car> res = cars.stream().collect(collectingAndThen(groupingBy(c -> c.model, maxBy(comparing(c -> c.price))),m -> m.values().stream().map(Optional::get).collect(toList())));

标签: java java-stream


【解决方案1】:

您可以按型号创建最大价值汽车的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))));

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-16
      • 2021-09-08
      • 1970-01-01
      • 2017-08-23
      • 1970-01-01
      • 2016-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多