比较器 '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);
}
我正在尝试按两个字段对两个对象进行排序。一个布尔值和一个整数。
但是我得到一个“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);
}