【发布时间】: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