Java 比较器';比较';无法解析方法

Java 比较器';比较';无法解析方法,java,android,comparator,Java,Android,Comparator,我试着用两个字段对两个对象进行排序。一个布尔值和一个整数。 但是,我在“比较”方法上得到了一个“无法解析方法” @Override public int compareTo(MyViewModel another) { return Comparator.comparing(MyViewModel::isEnabled) .thenComparingInt(MyViewModel::getPriority); } 下面是在不使用Java 8 API的情况下编写您想要的

我试着用两个字段对两个对象进行排序。一个布尔值和一个整数。 但是,我在“比较”方法上得到了一个“
无法解析方法”

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

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

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

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

    return Integer.compare(getPriority(), another.getPriority());
}
不幸的是,Android API 19中添加了
Boolean.compare()
Integer.compare()
,您说需要支持返回到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 API的情况下编写您想要的
compareTo()
方法的方法:

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

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

    return Integer.compare(getPriority(), another.getPriority());
}
不幸的是,Android API 19中添加了
Boolean.compare()
Integer.compare()
,您说需要支持返回到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;
    }
}

您提供的代码可用于Java8

当您将前面的
比较
参数从方法引用转换为
m->m.isEnabled
时,它将报告
无法解析“Object”中的方法“isEnabled”

然后,您可以显式地指定
m
类来解析它

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

您提供的代码可用于Java8

当您将前面的
比较
参数从方法引用转换为
m->m.isEnabled
时,它将报告
无法解析“Object”中的方法“isEnabled”

然后,您可以显式地指定
m
类来解析它

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

你确定你的IDE编译器是为Java 8或更高级的源代码配置的吗?嗯,让我觉得你没有使用Java 8。我使用的是Android Studio。我在哪里可以检查它的配置是否适用?您可以在Android上使用Java 8语言功能(lambdas、方法引用)(使用Gradle build plugin 3.x.x)。在min SDK 26之前,您不能使用Java 8语言API(Java.time,函数接口)。这意味着,即使您启用Java 8兼容性,您的应用程序也将在运行早于8.0.ohh的Android设备上崩溃。。这是个问题,我必须支持14分钟的skd。这怎么可能不是用java 8实现的?你确定你的IDE编译器是为java 8或更高级的源代码配置的吗?hmm让我觉得你不是在用java 8。我在用Android Studio。我在哪里可以检查它的配置是否适用?您可以在Android上使用Java 8语言功能(lambdas、方法引用)(使用Gradle build plugin 3.x.x)。在min SDK 26之前,您不能使用Java 8语言API(Java.time,函数接口)。这意味着,即使您启用Java 8兼容性,您的应用程序也将在运行早于8.0.ohh的Android设备上崩溃。。这是个问题,我必须支持14分钟的skd。不使用Java8怎么能实现呢?