处理惯用函数链接中的空列表

时间:2019-02-25 23:17:27

标签: generics kotlin

我刚进入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()
}

1 个答案:

答案 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() }
    

具有完全相同的结果。