代码之家  ›  专栏  ›  技术社区  ›  Barium Scoorge

Java 8 Stream collect:使用带有collectingAndThen的自定义groupingBy函数

  •  -1
  • Barium Scoorge  · 技术社区  · 6 年前

    考虑到以下有效代码:

        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)
                ));
    

    出了点问题,但它超出了我当前的xp,使用streams/lambdas

    1 回复  |  直到 6 年前
        1
  •  1
  •   Eugene    6 年前

    我真的不知道你的问题在哪里(除了你在一个地方使用 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