2017-02-09 335 views
8

比方說,我有一雙類的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()?

+2

嘗試'比較<配對,整數> comparing'。 – shmosel

+0

@shmosel哇工作,你介意添加它作爲一個答案,爲什麼它的工作原因!謝謝! –

+0

如果您使用[Comparator.comparingInt](https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#comparingInt-java.util.function),我懷疑您的問題會更少.ToIntFunction-)。 – VGR

回答

5

該錯誤似乎與Pair的通用參數有關。一種解決方法是使用一個明確的類型,因爲你已經嘗試:

pairList.sort(Comparator.<Pair>comparingInt(Pair::firstValue).thenComparingInt(Pair::secondValue)); 
//      ^^^^^^ 

注從而降低您需要指定參數的數量,並避免拳擊提高性能的comparingInt()

另一個解決方案是參數化類型的參考:

pairList.sort(Comparator.comparingInt(Pair<?,?>::firstValue).thenComparingInt(Pair::secondValue)); 
//          ^^^^^ 
3

它應該是:

pairList.sort(Comparator.<Pair, Integer>comparing(Pair::firstValue) 
             .thenComparing(Pair::secondValue)); 

第一類參數是指傳遞到比較器的類型。第二類參數是指比較器應該有效比較的類型。