collectors.maxby(comparator.naturalorder())不编译

zphenhs4  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(248)

我无法编译以下代码(请尝试onlinegdb):

List<Container<Dto>> list = Arrays.asList(
                new Container<>(new Dto("A"), 10L),
                new Container<>(new Dto("A"), 30L),
                new Container<>(new Dto("B"), 30L));

Map<String, Optional<Long>> mapWrong = list.stream()
    .collect(Collectors.groupingBy(
        c -> c.getOutput().getType(),
        Collectors.mapping(
            Container::getDifference, 
            Collectors.maxBy(Comparator.naturalOrder()))));     // DOESN'T WORK WITH THIS

不兼容类型:无法推断类型变量t、u、a、r、capture#2 of?、t、t(参数不匹配;类容器中的无效方法引用方法getdifference无法应用于给定类型(必需:找不到参数:java.lang.object原因:实际参数列表和形式参数列表长度不同)
我不知道是什么导致了编译错误。这个 Collectors.mapping 将对象Map到新值,然后 Container::getDifference 退货 long 同样的类型应该被推断成 Collectors.maxBy 代码应该被编译。
令人惊讶的是,当我替换 Comparator.naturalOrder()Comparator.comparingLong(l -> l) ,然后它就工作了。

Map<String, Optional<Long>> mapCorrect = list.stream()
    .collect(Collectors.groupingBy(
        c -> c.getOutput().getType(),
        Collectors.mapping(
            Container::getDifference, 
            Collectors.maxBy(Comparator.comparingLong(l -> l)))));   // A CHANGE TO FIX IT

使用的对象(包括所有参数构造函数和getter):

public class Container<T> {
    T output;
    long difference;
}
public class Dto {
    String type;
}

注意,使用openjdk和 jdk-11.0.5 以及 jdk1.8.0_212 . 我使用intellij idea,ide并没有突出这种错误,但是在编译时会出现这种错误。

yebdmbv4

yebdmbv41#

标准的oracle/openjdk编译器(版本8到14)的推理机无法正确跟踪正在发生的事情。
然而,eclipse的编译器可以,这就是为什么其他人说他们不能重现这个问题。
您需要通过指定以下内容来帮助它:

Collectors.maxBy(Comparator.<Long>naturalOrder()))));     // THIS NOW WORKS

相关问题