Java 8 Java8流收集:使用带有CollectionAndThen的自定义groupingBy函数

Java 8 Java8流收集:使用带有CollectionAndThen的自定义groupingBy函数,java-8,Java 8,考虑到以下有效代码: Map<CarType, Car> map3 = CarCollection.getList().stream() .collect(groupingBy(Car::getCarType, collectingAndThen( maxBy(Comparator.comparingInt(Car::getHp)),

考虑到以下有效代码:

    Map<CarType, Car> map3 = CarCollection.getList().stream()
            .collect(groupingBy(Car::getCarType,
                    collectingAndThen(
                            maxBy(Comparator.comparingInt(Car::getHp)),
                            Optional::get)
            ));
Map map3=CarCollection.getList().stream()
.collect(分组依据)(Car::getCarType,
收集然后(
maxBy(Comparator.comparingInt(Car::getHp)),
可选::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;
                }
            });
公共枚举类{
生态的,
有规律的
废气
}
//分类函数
函数groupingByCarClass=
(c->{
如果(c.getHp()50和&c.getHp()<150){
返回CarClass.regular;
}否则{
返回车类、气体和废物;
}
});
以下代码无效:

    Map<CarType, Car> map3 = CarCollection.getList().stream()
            .collect(groupingBy(groupingByCarClass,
                    collectingAndThen(
                            maxBy(Comparator.comparingInt(Car::getHp)),
                            Optional::get)
            ));
Map map3=CarCollection.getList().stream()
.收集(分组依据)(分组依据类别,
收集然后(
maxBy(Comparator.comparingInt(Car::getHp)),
可选::get)
));

有点不对劲,但它比我当前的streams/lambdas xp要高,我真的不知道你的问题出在哪里(除了在一个地方使用
CarClass::gas\u waste
和在另一个地方使用
CarClass::gas\u Pucker
,我假设它们是相同的),更不用说命名约定了。。。但无论哪种情况,您所做的都可以简化为:

Map<CarClass, Car> map3 = CarCollection.getList().stream()
            .collect(Collectors.toMap(
                    groupingByCarClass,
                    Function.identity(),
                    BinaryOperator.maxBy(Comparator.comparingInt(Car::getHp))));
Map map3=CarCollection.getList().stream()
.collect(collector.toMap)(
按类别分组,
Function.identity(),
maxBy(Comparator.comparingInt(Car::getHp));

如果您觉得可能需要使用
Collectors.collectingand然后(maxBy/minBy…,可选::get)
,您可能希望使用
Collectors.toMap(…)
,合并为
binarymoperator.maxBy

以下代码无效是什么意思?您得到的错误是什么?它没有编译;返回的类型不是预期的映射(而是一些lamdba?!),谢谢回复;将代码复制到SO时,CarClass gas_waste/gas_Pucker是一个错误。下划线在枚举中是被禁止的?@obstrommoirage无论如何它都是不被禁止的,但通常是上面的case@ObscurMoirage顺便问一下,我的答案中还有什么遗漏吗?没有,这似乎是一个不错的答案。我想我被groupingBy()工厂方法弄糊涂了,它不适用于这种构造。我目前正在阅读Java8的实际版本,并尝试将示例应用到我自己的集合中,有时还会将它们混合起来并扩展功能。这一次,它需要一些不同的东西。谢谢是的,很抱歉:)