我想將重復代碼放入方法中,但找不到解決方案。該方法應該采用不同類型的類型,例如實現 Comparable 的String和Long,以便使用該compareTo()函數。原來的:Comparator<Pair<String, Long>> PAIR_COMPARATOR_FIRST = (o1, o2) -> o1.getFirst() == null ? o2.getFirst() == null ? 0 : -1 : o2.getFirst() == null ? +1 : o1.getFirst().compareTo(o2.getFirst());Comparator<Pair<String, Long>> PAIR_COMPARATOR_SECOND = (o1, o2) -> o1.getSecond() == null ? o2.getSecond() == null ? 0 : -1 : o2.getSecond() == null ? +1 : o1.getSecond().compareTo(o2.getSecond());我嘗試過:(不起作用)Comparator<Pair<String, Long>> PAIR_COMPARATOR_FIRST =(o1, o2) -> nullProfCompare(o1.getFirst(), o2.getFirst());Comparator<Pair<String, Long>> PAIR_COMPARATOR_SECOND =(o1, o2) -> nullProfCompare(o1.getSecond(), o2.getSecond());public static int nullProfCompare(Comparable<T> o1, T o2) { return o1 == null ? o2 == null ? 0 : -1 : o2 == null ? +1 : o1.compareTo(o2);}我已經嘗試了很多類似使用instanceOf/isAssignableFrom但沒有任何效果。該方法應該如何只接受實現 Comparable 的變量?
1 回答

眼眸繁星
TA貢獻1873條經驗 獲得超9個贊
Java 8 已經具有支持 null 的Comparator
實現:
Comparator.nullsFirst(Comparator<? super T> comparator)
Comparator.nullsLast(Comparator<? super T> comparator)
看來你的方法nullProfCompare
是一樣的nullsFirst
。
您還可以使用該Comparator.comparing(Function<? super T,? extends U> keyExtractor)
方法來簡化您的代碼:
Comparator<Pair<String,?Long>>?PAIR_COMPARATOR_FIRST?= ????????Comparator.nullsFirst(Comparator.comparing(Pair::getFirst)); Comparator<Pair<String,?Long>>?PAIR_COMPARATOR_SECOND?= ????????Comparator.nullsFirst(Comparator.comparing(Pair::getSecond));
您的實現的問題nullProfCompare
在于您在使用時T
沒有定義它,并且您的兩個參數不是同一類型,而它們應該是同一類型。
這是正確的實現:
public?static?<T?extends?Comparable<T>>?int?nullProfCompare(T?o1,?T?o2)?{ ????return?o1?==?null???o2?==?null???0?:?-1?:?o2?==?null???+1?:?o1.compareTo(o2); }
添加回答
舉報
0/150
提交
取消