比较器 'comparing' 无法解析方法

Comparator 'comparing' cannot resolve method

我正在尝试按两个字段对两个对象进行排序。一个布尔值和一个整数。 但是我得到一个“cannot resolve method" on the 'comparing' method

@Override
public int compareTo(MyViewModel another) {
   return Comparator.comparing(MyViewModel::isEnabled)
          .thenComparingInt(MyViewModel::getPriority);
}

下面是我如何在不使用 Java 的情况下编写您想要的 compareTo() 方法 8 APIs:

@Override
public int compareTo(MyViewModel another) {
    int enabledComparison = Boolean.compare(isEnabled(), another.isEnabled());

    if (enabledComparison != 0) {
        return enabledComparison;
    }

    return Integer.compare(getPriority(), another.getPriority());
}

很遗憾,Boolean.compare()Integer.compare()是在AndroidAPI19中加入的,你说要支持回14,所以你连用那个。你必须一直手写出来。

@Override
public int compareTo(MyViewModel another) {
    int enabledComparison = compare(isEnabled(), another.isEnabled());

    if (enabledComparison != 0) {
        return enabledComparison;
    }

    return compare(getPriority(), another.getPriority());
}

private static int compare(boolean a, boolean b) {
    if (a == b) {
       return 0;
    } else if (a) {
       return 1;
    } else {
       return -1;
    }
}

private static int compare(int a, int b) {
    if (a == b) {
        return 0;
    } else if (a > b) {
        return 1;
    } else {
        return -1;
    }
}

您提供的代码确实适用于 Java 8.

并且当您将前 comparing 参数从方法引用转换为 m -> m.isEnabled 时,它会像您描述的那样报告 can't resolve method 'isEnabled' in 'Object'

那么,你可以如下明确指定m的class来解决。

  @Override
    public int compareTo(MyViewModel another) {
       return Comparator.comparing((MyViewModel m) -> m.isEnabled)
              .thenComparingInt(MyViewModel::getPriority);
    }