首页 > 解决方案 > 在比较器中使用字符串时出错

问题描述

我正在尝试创建一个实现可比较的类。当所有类元素都是整数时,一切正常。当我使用 String 并使用comparing而不是comparingInt时,我收到以下错误。

public class myClass implements Comparable<myClass> {
    @Column (name="From")
    private String from;
    @Column (name="To")
    private String to;
    @Column (name="With")
    private String with;
    @Column (name="amount")
    private int amount;

    // Setters, getters, constructor

    Comparator<myClass > comp = Comparator.<myClass>comparing(myClass::getFrom)
            .thenComparing(myClass::getTo)
            .thenComparing(myClass::getWith)
            .thenComparingInt(myClass::getAmount);
    @Override
    public int compareTo(myClass o) {
        return comp.compare(this, o);
    }
}

有人能指出我在这里可能缺少什么吗?

标签: javacomparatorcomparable

解决方案


Comparator::comparing是一个通用方法,它采用一个用于提取要比较的值的函数。您将方法引用传递给myClass::getFrom返回 aString并将在myClass类型 object 上调用的方法(通过Function::apply)。这就是为什么你必须传递泛型类型myClassString.

但是,您可以省略这些泛型类型,因为您将比较器分配给Comparator<myClass> comp变量,因此可以自动推断类型(也使用您使用的方法引用中的类型)。

进一步看让我们看看Comparator::comparing(Function)方法实现:

static <T, U extends Comparable<? super U>> Comparator<T> comparing(Function<? super T, ? extends U> var0) {
    Objects.requireNonNull(var0);
    return (Comparator)((Serializable)((var1x, var2x) -> {
        return ((Comparable)var0.apply(var1x)).compareTo(var0.apply(var2x));
    }));
}

这里T将是myClass并且U将会是String。函数var0myClass作为参数并返回String(因此方法引用myClass::getFrom将在这里工作 - 通常它就像getFrommyClass对象上调用)。实际上,正如您所看到的,此方法将返回 aComparator作为 lambda 函数,该函数将使用函数var0var1xand中提取值var2x(它们都是myClass类型)。对我来说,它看起来有点像一个闭包。


推荐阅读