比较实现Comparable的对象更优雅的方式
我有以下对象(假设类Rank实现了Comparable):
Rank rankA; Rank rankB;
我会比较他们这样的:
if(rankA.compareTo(rankB) < 0) // rankA < rankB doSomething();
要么
if(rankA.compareTo(rankB) == 0) // rankA == rankB doSomething();
要么
if(rankA.compareTo(rankB) > 0) // rankA > rankB doSomething();
我发现上面的这些陈述很难阅读,即使增加了评论。 有没有更优雅,更可读的解决方案? 我知道我可以为此实现一个方法,但是我正在寻找一个最好已经实现的解决方案,所以我不必创建一个util方法。
那么,在很多编程语言(而不仅仅是Java)中的传统方式是比较函数返回一个数字,如果第一个出现在第二个之前,则为负;如果两个都应该被认为是相等的,则为零;如果第一个是在第二个之后。
你可以做什么,如果你喜欢的是添加自己的方法,例如:
boolean isBefore(Rank rank) { return this.compareTo(rank) < 0; } boolean isSame(Rank rank) { return this.compareTo(rank) == 0; } boolean isAfter(Rank rank) { return this.compareTo(rank) > 0; }
你甚至可以用默认方法创建你自己的通用接口:
public interface EasyComparable<C> extends Comparable<C> { default boolean isBefore(C that) { return this.compareTo(that) < 0; } default boolean isSame(C that) { return this.compareTo(that) == 0; } default boolean isAfter(C that) { return this.compareTo(that) > 0; } }
然后让您的Rank
实现EasyComparator
而不是Comparator
。
那么你将能够做到:
if (rankA.isBefore(rankB)) { doSomething(); } else if (rankA.isSame(rankB)) { doSomething(); } else if (rankA.isAfter(rankB)) { doSomething(); }
然后,您将可以在其他对象上执行此操作,而不仅仅是Rank
。
如果你对Rank
类没有控制权,你也可以扩展Comparator
,也可以添加3个默认的方法,但是它们必须有两个参数,而不是一个。
也许不是你想要的答案,但你可以用Kotlin来代替。 在这里,您可以编写类似于您在评论中提到的代码:
fun main(args: Array<String>) { val s1 = "aaaa" val s2 = "bbbb" val s3 = "cccc" println("s1 < s2: ${s1 < s2}") println("s1 == s2: ${s1 == s2}") println("s1 < s2: ${s1.compareTo(s2) < 0}") println("s1 > s2: ${s1 > s2}") println("s3 > s2: ${s3 > s2}") }
s1 < s2
实际上是s1.compareTo(s2) < 0
。
所以Kotlin解决了你提到的问题。
上面代码的输出:
s1 < s2: true s1 == s2: false s1 < s2: true s1 > s2: false s3 > s2: true
你的代码是好的。 我会用它如下:
int result = rankA.compareTo(rankB); if(result == 0) { //do sth } else if (result <0) { //do sth } else { //do sth }