考虑以下有效代码:
Map<CarType, Car> map3 = CarCollection.getList().stream()
.collect(groupingBy(Car::getCarType,
collectingAndThen(
maxBy(Comparator.comparingInt(Car::getHp)),
Optional::get)
));
是否可以使用下面的功能来自定义groupingBy功能?
public enum CarClass {
eco,
regular,
gas_waste
}
//classification function
Function<Car, CarClass> groupingByCarClass =
(c -> {
if(c.getHp() <= 50) {
return CarClass.eco;
} else if(c.getHp() > 50 && c.getHp() < 150) {
return CarClass.regular;
} else {
return CarClass.gas_waste;
}
});
以下代码无效:
Map<CarType, Car> map3 = CarCollection.getList().stream()
.collect(groupingBy(groupingByCarClass,
collectingAndThen(
maxBy(Comparator.comparingInt(Car::getHp)),
Optional::get)
));
出了点问题,但高于我当前使用流/ lambda的xp
答案 0 :(得分:1)
我真的无法确定您的问题出在哪里(除了在一个地方使用CarClass::gas_waste
而在另一个CarClass::gas_sucker
的情况下,我会假设它们是相同的),而不是提到命名约定...但是无论哪种情况,您所做的都可以简化为:
Map<CarClass, Car> map3 = CarCollection.getList().stream()
.collect(Collectors.toMap(
groupingByCarClass,
Function.identity(),
BinaryOperator.maxBy(Comparator.comparingInt(Car::getHp))));
如果您认为可能需要使用Collectors.collectingAndThen(maxBy/minBy..., Optional::get)
,则可能希望将Collectors.toMap(...)
与合并为BinaryOperator.maxBy
一起使用