如果Kotlin中的参数不为空,则过滤列表

时间:2018-08-09 16:55:24

标签: kotlin

我有以下代码:

list.filterIfNotEmpty(module) { it.name.contains(module!!, ignoreCase = true) }
    .filterIfNotEmpty(repoUrl) { it.repo.contains(repoUrl!!, ignoreCase = true) }
    .filterIfNotEmpty(owner) { it.owner.contains(owner!!, ignoreCase = true) }

fun <T> List<T>.filterIfNotEmpty(value: String?, predicate: (T) -> Boolean): List<T> {
  return when {
    value.isNullOrBlank() -> this
    else -> filterTo(ArrayList<T>(), predicate)
  }
}

我很确定!!不是一个好主意,但不确定在没有可变列表的情况下如何避免使用它。
有想法吗?

编辑:

这是我目前的想法,不确定是否可读性

list.filterIfCriteriaNotEmpty(module) { it.name }
    .filterIfCriteriaNotEmpty(repoUrl) { it.repo }
    .filterIfCriteriaNotEmpty(owner) { it.owner }

fun <T> List<T>.filterIfCriteriaNotEmpty(filter: String?, stringProducer: (T) -> String): List<T> {
  return when {
    filter == null || filter.isBlank() -> this
    else -> this.filter { stringProducer(it).contains(filter, ignoreCase = true) }
  }
}

1 个答案:

答案 0 :(得分:1)

除非您正在使用的变量是可变的,否则在此处使用!!应该很好,因为如果谓词lambda的值首先为null,则永远不会调用该谓词。

您可以通过从谓词内部的value函数中返回filterIsNotEmpty来解决该问题,例如:

fun <T> List<T>.filterIfNotEmpty(value: String?, predicate: (String, T) -> Boolean): List<T> {
    return when {
        value == null || value.isBlank() -> this
        else -> filter { predicate(value, it) }
    }
}

缺点是您必须更详细地调用该函数:

list.filterIfNotEmpty(module) { value, element -> element.name.contains(value, ignoreCase = true) }