Самый идиоматичный способ добавить элемент в список ifNotEmpty () в Kotlin - PullRequest
1 голос
/ 01 октября 2019

Я хочу добавить к элементу List<Thing>, но только если список не пустой.

Я думал о комбинации takeIf { it.isNotEmpty() }, orEmpty() и flatMap.

Какой самый идиоматичный способ сделать это в Котлине?

Ответы [ 2 ]

0 голосов
/ 02 октября 2019

Вот немного кода, который довольно идиоматичен ИМХО:

infix fun <T> Collection<T>?.prependIfNotEmpty(other: Collection<T>): Collection<T>? =
        if (this?.isNotEmpty() == true)
            other + this
        else
            this

// or for non nullable lists your approach
infix fun <T> Collection<T>.prependIfNotEmptyNonNull(other: Collection<T>): Collection<T> = other.takeIf { isNotEmpty() }.orEmpty() + this

использование

listOf(1, 2, 3) prependIfNotEmpty listOf(-1, 0) // [-1,0,1,2,3]

listOf("two", "three", "four").prependIfNotEmpty(listOf("zero", "one")) // ["zero", "one", "two", "three", "four"]

val list: List<Float>? = null

list prependIfNotEmpty listOf(3.5, 5.6) // null

//for prependIfNotEmptyNonNull the same usage

Возможно, есть более идиоматический способ, но я все еще не понял его.

Надеюсь, это поможет.

0 голосов
/ 02 октября 2019

Вот что я придумал

val myEmptyList = listOf<String>()
val myNotEmptyList = listOf<String>("is", "the", "worst")

listOf("first").takeIf { myEmptyList.isNotEmpty() }.orEmpty() + myEmptyList
listOf("first").takeIf { myNotEmptyList.isNotEmpty() }.orEmpty() + myNotEmptyList

Вывод:

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