【发布时间】:2017-06-26 22:24:16
【问题描述】:
假设我有一个 Pair 类
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));
一切运行良好,列表按pair的第一个值排序,但如果我这样做
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
为什么它适用于 compare() 而不是 compare().thenComparing() ?
【问题讨论】:
-
试试
Comparator.<Pair, Integer>comparing。 -
@shmosel 哇,这有效,您介意将其添加为答案,并说明其有效的原因吗!谢谢!
-
@VGR 出乎意料地没有。链式比较器的类型推断是old problem,但通常可以通过方法引用来避免。但是
Pair中的泛型参数有一些问题在这里造成了问题。 -
@MayurKulkarni 请出示您的
pairList声明。 -
@MayurKulkarni 这仍然是更好的选择,因为它避免了拳击。
标签: java java-8 comparator