我有以下代码:
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) }
}
}
答案 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) }