科特林代码重构

我有一个function是检查是否有搜索条件。

var currentStatus = MutableLiveData<List>() private var sellerIds: List? = null private var subSellerIds: List? = null private var partnerIds: List? = null private var productTypeIds: List? = null private var brunchIds: List? = 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(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 } 

但是提交的types可能是List? 或String?,所以得到’isNotEmpty不是未解决的引用’错误。

我怎样才能重构这个方法来明确?

List<*>?做两个单独的重载方法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知道它不能变成一个。

国际海事组织另一个更糟糕的做法是保持Any? 作为参数types,并检查在运行时是否有ListString

 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) 

Kotlin stdlib包含函数

 public inline fun CharSequence?.isNullOrEmpty(): Boolean = this == null || this.length == 0 public inline fun CharSequence?.isNullOrBlank(): Boolean = this == null || this.isBlank() 

你可以为Collection?定义类似的乐趣Collection?