Java 8 比较器比较不链接
Java 8 Comparator comparing doesn't chain
假设我有一双 class
public class Pair<P, Q> {
public P p;
public Q q;
public Pair(P p, Q q) {
this.p = p;
this.q = q;
}
public int firstValue() {
return ((Number)p).intValue();
}
public int secondValue() {
return ((Number)q).intValue();
}
}
我希望先按第一个值,然后按第二个值对其进行排序。现在'如果我这样做
List<Pair<Integer, Integer>> pairList = new ArrayList<>();
pairList.add(new Pair<>(1, 5));
pairList.add(new Pair<>(2, 2));
pairList.add(new Pair<>(2, 22));
pairList.add(new Pair<>(1, 22));
pairList.sort(Comparator.comparing(Pair::firstValue));
一切都很好,列表按对的第一个值排序,但如果我这样做
pairList.sort(Comparator.comparing(Pair::firstValue).thenComparing(Pair::secondValue));
它因错误而失败
Error:(24, 38) java: incompatible types: cannot infer type-variable(s) T,U
(argument mismatch; invalid method reference
method firstValue in class DataStructures.Pair<P,Q> cannot be applied to given types
required: no arguments
found: java.lang.Object
reason: actual and formal argument lists differ in length)
好的,所以它可能无法推断出参数,所以如果我这样做
pairList.sort(Comparator.<Integer, Integer>comparing(Pair::firstValue)
.thenComparing(Pair::secondValue));
它因错误而失败
Error:(24, 39) java: invalid method reference
non-static method firstValue() cannot be referenced from a static context
为什么它适用于 comparing() 而不适用于 comparing().thenComparing() ?
应该是:
pairList.sort(Comparator.<Pair, Integer>comparing(Pair::firstValue)
.thenComparing(Pair::secondValue));
第一个类型参数是指传递给 Comparator 的类型。第二类参数是指比较器应该有效比较的类型。
错误似乎与 Pair
的通用参数有关。一种解决方法是使用显式类型,正如您所尝试的那样:
pairList.sort(Comparator.<Pair>comparingInt(Pair::firstValue).thenComparingInt(Pair::secondValue));
// ^^^^^^
请注意 comparingInt()
,它减少了您需要指定的参数数量,并通过避免装箱提高了性能。
另一个解决方案是参数化类型引用:
pairList.sort(Comparator.comparingInt(Pair<?,?>::firstValue).thenComparingInt(Pair::secondValue));
// ^^^^^
假设我有一双 class
public class Pair<P, Q> {
public P p;
public Q q;
public Pair(P p, Q q) {
this.p = p;
this.q = q;
}
public int firstValue() {
return ((Number)p).intValue();
}
public int secondValue() {
return ((Number)q).intValue();
}
}
我希望先按第一个值,然后按第二个值对其进行排序。现在'如果我这样做
List<Pair<Integer, Integer>> pairList = new ArrayList<>();
pairList.add(new Pair<>(1, 5));
pairList.add(new Pair<>(2, 2));
pairList.add(new Pair<>(2, 22));
pairList.add(new Pair<>(1, 22));
pairList.sort(Comparator.comparing(Pair::firstValue));
一切都很好,列表按对的第一个值排序,但如果我这样做
pairList.sort(Comparator.comparing(Pair::firstValue).thenComparing(Pair::secondValue));
它因错误而失败
Error:(24, 38) java: incompatible types: cannot infer type-variable(s) T,U
(argument mismatch; invalid method reference
method firstValue in class DataStructures.Pair<P,Q> cannot be applied to given types
required: no arguments
found: java.lang.Object
reason: actual and formal argument lists differ in length)
好的,所以它可能无法推断出参数,所以如果我这样做
pairList.sort(Comparator.<Integer, Integer>comparing(Pair::firstValue)
.thenComparing(Pair::secondValue));
它因错误而失败
Error:(24, 39) java: invalid method reference
non-static method firstValue() cannot be referenced from a static context
为什么它适用于 comparing() 而不适用于 comparing().thenComparing() ?
应该是:
pairList.sort(Comparator.<Pair, Integer>comparing(Pair::firstValue)
.thenComparing(Pair::secondValue));
第一个类型参数是指传递给 Comparator 的类型。第二类参数是指比较器应该有效比较的类型。
错误似乎与 Pair
的通用参数有关。一种解决方法是使用显式类型,正如您所尝试的那样:
pairList.sort(Comparator.<Pair>comparingInt(Pair::firstValue).thenComparingInt(Pair::secondValue));
// ^^^^^^
请注意 comparingInt()
,它减少了您需要指定的参数数量,并通过避免装箱提高了性能。
另一个解决方案是参数化类型引用:
pairList.sort(Comparator.comparingInt(Pair<?,?>::firstValue).thenComparingInt(Pair::secondValue));
// ^^^^^