2017-01-13 4 views
4

Мне нужно отобразить список и получить первый ненулевой элемент, и мне нужно, чтобы операция с картой была короткой, как это должно быть в 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 } 

Проблема в том, что это будет отображать все элементы итерации, и это необходимо к моему варианту использования, который останавливается в первом непустом элементе.

ответ

8

Котлин была лениво оценивали sequences, которые соответствуют Java 8 потоков, вместо того, чтобы вызывать stream() на коллекции, вы вызываете asSequence():

return this 
     .asSequence() 
     .map { transform(it) } 
     .firstOrNull { it != null } 
+2

'.firstOrNull {it! = Null}' не совпадает с 'firstOrNull()'. Первый возвращает первый ненулевой элемент или null, если последовательность пуста. Последний возвращает первый элемент независимо от того, является ли он нулевым или нет (или null, если он пуст). – marstran

+1

@marstran, конечно, вы правы, я исправил его –

0

Интересно, что быстрее, решение в @ ingoKegel, либо это:

return this.firstOrNull { transform(it) != null }?.let { transform(it) } 
+1

В зависимости от трансформации это может дать много накладных расходов. Но для моего случая мне нужно, чтобы преобразование выполнялось только один раз – Love

Смежные вопросы