Kotlin продолжить работу на карте - PullRequest
0 голосов
/ 13 сентября 2018

Я пытаюсь преобразовать список с помощью серии вызовов фильтра и карты. Логика фильтра снова используется в вызове карты, и я хочу избежать этого дублирующего вызова. Я думаю, что код хорошо подводит итог:

fun main(args: Array<String>) {
    multipleCalls()
    wontCompile()
}

fun multipleCalls(){
    val arr = intArrayOf(1,2,3)
    val list = arr.filter{
        it.heavyLogic() != null
    }.map{
        it.heavyLogic()    //heavyLogic() called again
    }
    print(list)
}

fun wontCompile(){
    val arr = intArrayOf(1,2,3)
    val list = arr.map{
        val str = it.heavyLogic()
        if(str == null) continue //break and continue are only allowed inside a loop
        else str
    }
    print(list)
}

Есть ли эквивалент карты break / continue внутри карты, который может исправить wontCompile()?

Я понимаю, что у меня также может быть map return null s, в результате чего получается list типа List<String?> - и затем filter на null. Но это все еще повторяет список дважды.

1 Ответ

0 голосов
/ 13 сентября 2018

Вы можете использовать mapNotNull .

inline fun <T, R : Any> Array<out T>.mapNotNull(
    transform: (T) -> R?
): List<R> (source)

Я понимаю, что карта также может возвращать нули, составляя список Тип списка - и затем фильтр по нулю. Но это все еще повторяется список дважды.

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

/**
 * Applies the given [transform] function to each element in the original collection
 * and appends only the non-null results to the given [destination].
 */
public inline fun <T, R : Any, C : MutableCollection<in R>> Iterable<T>.mapNotNullTo(destination: C, transform: (T) -> R?): C {
    forEach { element -> transform(element)?.let { destination.add(it) } }
    return destination
}

В своем коде вы можете сделать так:

val list = arr.mapNotNull{
    it.heavyLogic()
}

Вы также можете проверить filterNotNull .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...