在Kotlin中,是否有任何简洁的方法为接口生成Comparable#compareTo()
函数,该接口只按声明顺序为接口的每个属性调用this.property1.compareTo(that.property1)
?显然,接口的每个属性都实现Comparable
。
对于接口I
,看起来我可以创建一个顶级的val,如:
private val COMPARATOR = compareBy<I>(
{it.property1},
{it.property2},
{it.property3},
...
)
来自return COMPARATOR.compare(this, other)
的{{1}},但是,有没有更简单的方法可以做到这一点?
答案 0 :(得分:1)
您可以使用反射和一些简单的语言功能,如下所示:
inline fun <reified T : Any> compareByAll(): Comparator<T> {
val selector = T::class.memberProperties
.map { { i: T -> it.get(i) as Comparable<*> } }
.toTypedArray()
return compareBy(*selector)
}
像这样使用:
val testInput = listOf(I(1, 2, 3), I(1, 2, 4), I(1, 0, 4), I(2, 3, 4), I(0, 1, 2)
testInput.sortedWith(compareByAll()))
请注意,此解决方案无法处理属性不是Comparable
的情况。