Java 8 Stream收集:将自定义分组功能与collectingAndThen结合使用

时间:2018-08-20 10:19:20

标签: java-8

考虑以下有效代码:

    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

1 个答案:

答案 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一起使用