Мне нужно отобразить список и получить первый ненулевой элемент, и мне нужно, чтобы операция с картой была короткой, как это должно быть в Java 8 streams API. Есть ли готовый способ сделать это в Котлине, без потоков Java 8?Карта короткого замыкания Kotlin {}. FirstOrNull {}
Я создал свой собственный метод расширения, чтобы сделать это:
fun <T, R> Iterable<T>.firstNonNullMapping(transform: (T) -> R?): R? {
for (element in this) {
val result = transform(element)
if (result != null) {
return result
}
}
return null
}
тест доказывает, что это работает
val firstNonNullMapping = listOf(null, 'a', 'b')
.firstNonNullMapping {
assertNotEquals(it, 'b') // Mapping should be stopped before reaching 'b'
it
}
assertEquals(firstNonNullMapping, 'a')
IntelliJ, однако, предположить, что я заменить цикл с гораздо аккуратнее
return this
.map { transform(it) }
.firstOrNull { it != null }
Проблема в том, что это будет отображать все элементы итерации, и это необходимо к моему варианту использования, который останавливается в первом непустом элементе.
'.firstOrNull {it! = Null}' не совпадает с 'firstOrNull()'. Первый возвращает первый ненулевой элемент или null, если последовательность пуста. Последний возвращает первый элемент независимо от того, является ли он нулевым или нет (или null, если он пуст). – marstran
@marstran, конечно, вы правы, я исправил его –