Kotlin:从类的属性生成Comparable#compareTo()函数

时间:2018-06-04 13:52:52

标签: kotlin compare comparator compareto

在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}},但是,有没有更简单的方法可以做到这一点?

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的情况。