Рефакторинг кода Котлина

У меня есть функция, которая проверяет, есть ли условия поиска или нет.

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 } 

Но тип подачи может быть List? или String ?, поэтому получение ошибки isNotEmpty не является нерешенной ссылкой.

Как я могу реорганизовать метод, чтобы сделать его понятным?

Сделайте два отдельных перегруженных метода для 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? как тип параметра и проверьте, есть ли у вас 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) 

Kotlin stdlib содержит функции

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

Вы можете определить аналогичную забаву для Collection?