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