让我说我有这个简单的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执行此操作,但我只是在努力将正确的调用链接在一起。
在我的脑海中,我会想象伪代码会是这样的:
尝试将它们拼接在一起有点混乱 - 任何想法?
答案 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();