我刚进入Kotlin大约有2周的时间,我对函数式编程非常感兴趣,因此我不确定这是否会错过FP中的基本用法,因为我想处理样板,例如从存储库中检索结果,如果结果是一个空列表,然后我想要一个日志语句并希望其他链接的调用停止。通常,为什么不存在(至少对我来说不明显)处理空列表的函数?像下面吗?问这个问题,我可能可以省去“此”空检查。
fun <E : Any, T : List<E>> T?.ifEmpty(func: () -> Unit): List<E> {
if (this == null || this.isEmpty()) {
func()
return emptyList()
}
return this
}
fun <E : Any, T : List<E>> T?.ifNotEmpty(func: (List<E>) -> Unit): List<E> {
if (this != null && !this.isEmpty()) {
func(this)
return this
}
return emptyList()
}
fun <E : Any, F: Any, T : List<E>> T?.mapIfNotEmpty(func: (List<E>) -> (List<F>)): List<F> {
if (this != null && !this.isEmpty()) {
return func(this)
}
return emptyList()
}
答案 0 :(得分:3)
ifEmpty自Kotlin 1.3(kotlin.collections)起可用。
ifNotEmpty
看起来像无用的函数,通常我们会遍历列表,如果列表为空,我们的代码将不会执行。因此,例如
list.ifNotEmpty { do sth with whole list. sth like iteration? mapping? }
具有与
相同的效果list.forEach { do sth with only one element and nothing if list is empty }
list.map { map every element to other object }
如果还不够的话,您可以这样写:
list.takeIf { it.isNotEmpty() }?.apply|let // unfortunately it looks ugly
mapIfNotEmpty 同样的故事,例如
listOf<String>("ab", "cd").mapIfNotEmpty { it.reversed() }
listOf<String>("ab", "cd").map { it.reversed() }
具有完全相同的结果。