为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

繁华开满天机 2023-10-13 14:54:22
我想将重复代码放入方法中,但找不到解决方案。该方法应该采用不同类型的类型,例如实现 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);
}


查看完整回答
反对 回复 2023-10-13
  • 1 回答
  • 0 关注
  • 87 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信