Есть ли более элегантный способ написать этот геттер в Kotlin?

#kotlin

#kotlin

Вопрос:

Новичок в Kotlin — любопытно, есть ли более элегантный способ написать duration геттер для следующего класса (или какие-либо другие советы по стилю или подводные камни):

 open class Timeline(
    open var props: MutableList<Prop> = mutableListOf()) {

    val duration: Long
        get() {
            var best: Prop? = null
            props.forEach {
                if (best == null || it.interval.end > best?.interval!!.end) {
                    best = it
                }
            }
            return best?.interval?.end ?: 0L
        }
}
  

По сути, это просто поиск реквизита с наибольшим интервалом. Я знаю, что я мог бы просто убедиться, что props List сортируется при добавлении в него элементов, и просто захватить элемент в конце списка, но вопрос не в этом.

Комментарии:

1. @Carcigenicate — вот так? длительность значения: Long get() = props.map { it.interval.end }.reduce { acc, l -> if (l > acc) l else acc }

Ответ №1:

Если вы пытаетесь найти наибольшее значение end , вы можете сделать это в однострочном:

 val duration: Long = 
    props.map { it.interval.end }.max() ?: 0L
  

По сути, это говорит: «Преобразуйте каждое значение Prop в его interval.end значение и возьмите максимальное значение. Если нет максимального значения, верните 0 «.

Чтобы расширить это, если бы вы хотели, чтобы Prop значение было самым высоким interval.end , вы бы написали это таким образом:

 val bestProp: Prop? = 
    props.maxBy { it.interval.end }
  

Что означает: «Найдите Prop значение max interval.end или null, если ничего не найдено».

Комментарии:

1. Спасибо, мне это нравится

2. Возможно, это просто ошибка, но ваш ответ функционально отличается от кода OPs: это инициализация свойства вместо геттера, который может возвращать разные значения при props изменении.

3. Очень верное замечание, @Pawel. Небольшое изменение — это все, что было бы необходимо. get() = props.map { it.interval.end }.max() ?: 0L