创建仅采用值作为参数的方法,该方法实现 Comparable<T>

我想将重复代码放入方法中,但找不到解决方案。该方法应该采用不同类型的类型,例如实现 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 的变量?


繁华开满天机
浏览 84回答 1
1回答

眼眸繁星

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); }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java