我想在List<Thing>
前面加上一个元素,但前提是列表不为空。
我正在考虑takeIf { it.isNotEmpty() }
,orEmpty()
和flatMap
的组合。
在Kotlin中最惯用的方法是什么?
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]
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
也许还有一种更惯用的方式,但是我仍然没有弄清楚。
希望有帮助。