#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