比方說,我有一雙類的Java 8比較比較並不鏈
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
爲什麼它比較(),而不是工作比較()。thenComparing()?
嘗試'比較<配對,整數> comparing'。 – shmosel
@shmosel哇工作,你介意添加它作爲一個答案,爲什麼它的工作原因!謝謝! –
如果您使用[Comparator.comparingInt](https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#comparingInt-java.util.function),我懷疑您的問題會更少.ToIntFunction-)。 – VGR