我有一个函数,它检查是否有搜索条件。
var currentStatus = MutableLiveData<List<Int>>()
private var sellerIds: List<Int>? = null
private var subSellerIds: List<Int>? = null
private var partnerIds: List<Int>? = null
private var productTypeIds: List<Int>? = null
private var brunchIds: List<Int>? = null
private var contractDateFrom: String? = null
private var contractDateTo: String? = null
private var completeDateFrom: String? = null
private var completeDateTo: String? = null
private var totalStatusCnt: Int = 10
val isSearching = ObservableField<Boolean>(false)
private fun checkIfSearchConditions() {
if (currentStatus.value != null && currentStatus.value!!.isNotEmpty() &&
currentStatus.value?.size != totalStatusCnt) {
isSearching.set(true)
} else if (keyword != null && keyword!!.isNotEmpty()) {
isSearching.set(true)
} else if (sellerIds != null && sellerIds!!.isNotEmpty()) {
isSearching.set(true)
} else if (subSellerIds != null && subSellerIds!!.isNotEmpty()) {
isSearching.set(true)
} else if (partnerIds != null && partnerIds!!.isNotEmpty()) {
isSearching.set(true)
} else if (productTypeIds != null && productTypeIds!!.isNotEmpty()) {
isSearching.set(true)
} else if (brunchIds != null && brunchIds!!.isNotEmpty()) {
isSearching.set(true)
} else if (contractDateFrom != null && contractDateFrom!!.isNotEmpty()) {
isSearching.set(true)
} else if (contractDateTo != null && contractDateTo!!.isNotEmpty()) {
isSearching.set(true)
} else if (completeDateFrom != null && completeDateFrom!!.isNotEmpty()) {
isSearching.set(true)
} else if (completeDateTo != null && completeDateTo!!.isNotEmpty()) {
isSearching.set(true)
} else {
isSearching.set(false)
}
}而且checkIfSearchConditions方法看起来很脏,所以我想重构这个方法来说明清楚。
我试着做一个空的检查方法,
private fun checkIfNotEmpty(field: Any?): Boolean {
return field != null && field!!.isNotEmpty() // isNotEmpty is not unsolved reference
}但文件类型可以是列表吗?或者字符串?,因此获取'isNotEmpty‘不是未解决的引用’错误。
如何重构该方法以明确说明?
发布于 2017-11-22 08:12:05
为List<*>?和String?创建两个单独的重载方法
private fun checkIfNotEmpty(field: String?): Boolean {
return field != null && field.isNotEmpty()
}
private fun checkIfNotEmpty(field: List<*>?): Boolean {
return field != null && field.isNotEmpty()
}注意,在这些方法中,您不需要在!!中使用field!!.isNotEmpty():因为它不是一个var,在检查它不等于null之后,Kotlin知道它不能变成一个var。
另一种更糟的方法是将Any?保持为参数类型,并检查运行时是否有List或String:
private fun checkIfNotEmpty(field: Any?): Boolean {
return when(field) {
null -> false
is List<*> -> field.isNotEmpty()
is String -> field.isNotEmpty()
else -> false
}
}此外,所有具有相同主体的else if分支都可以使用||进行组合:
if ((checkIfNotEmpty(currentStatus) &&
currentStatus?.value?.size != totalStatusCnt) ||
checkIfNotEmpty(keyword) ||
checkIfNotEmpty(sellerIds) || ...
) {
isSearching.set(true)
} else {
isSearching.set(false)
}它可以改进得更好
val isSearchingValue = (checkIfNotEmpty(currentStatus) &&
currentStatus?.value?.size != totalStatusCnt) ||
checkIfNotEmpty(keyword) ||
checkIfNotEmpty(sellerIds) || ...
isSearching.set(isSearchingValue)发布于 2017-11-22 10:30:42
Kotlin stdlib包含函数
public inline fun CharSequence?.isNullOrEmpty(): Boolean = this == null || this.length == 0
public inline fun CharSequence?.isNullOrBlank(): Boolean = this == null || this.isBlank()您可以为Collection?定义类似的乐趣
https://stackoverflow.com/questions/47429484
复制相似问题