Kotlin: сгенерируйте функцию Comparable # compareTo () из свойств класса - PullRequest
0 голосов
/ 04 июня 2018

Есть ли в 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)из I#compareTo(I), но есть ли более простой способ сделать это?

1 Ответ

0 голосов
/ 04 июня 2018

Вы можете использовать рефлексию и некоторые простые языковые функции, например:

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.

...