[英]Apply multiple search in fields
fun getMatchingContactsFromSearch(startDate: String?, endDate: String?, whereMet: String?, eventName: String?, product: String?, service: String?): Observable<List<String>> {
{
if ((eventName!!.isNotEmpty()) && whereMet!!.isEmpty() && (startDate!!.isEmpty() && endDate!!.isEmpty())&& product!!.isEmpty()&& service!!.isEmpty()) {
} else if ((whereMet!!.isNotEmpty()) && eventName!!.isEmpty() && (startDate!!.isEmpty() && endDate!!.isEmpty())&& product!!.isEmpty()&& service!!.isEmpty()) {
} else if ((startDate!!.isNotEmpty() && endDate!!.isNotEmpty()) && eventName!!.isNotEmpty() && whereMet!!.isEmpty()&& product!!.isEmpty()&& service!!.isEmpty()) {
} else if ((startDate!!.isNotEmpty() && endDate!!.isNotEmpty()) && eventName!!.isEmpty() && whereMet!!.isNotEmpty()&& product!!.isEmpty()&& service!!.isEmpty()) {
} else if ((eventName!!.isNotEmpty() && whereMet!!.isNotEmpty()) && ((startDate!!.isEmpty() && endDate!!.isEmpty()))&& product!!.isEmpty()&& service!!.isEmpty()) {
} else if (eventName!!.isEmpty() && whereMet!!.isEmpty() && (startDate!!.isNotEmpty() && endDate!!.isNotEmpty())&& product!!.isEmpty()&& service!!.isEmpty()) {
} else if (eventName!!.isNotEmpty() && whereMet!!.isNotEmpty() && startDate!!.isNotEmpty() && endDate!!.isNotEmpty()&& product!!.isEmpty()&& service!!.isEmpty()) {
} else {
}
}
這是我的多個項目的搜索代碼 我還有 2 個字段可以搜索,例如產品和服務 我也必須為此應用條件,但是將搜索條件應用到另外兩個字段似乎非常復雜 誰能建議我如何應用搜索條件對於另外兩個字段,或者給我一些其他方式,以便我們可以從 listOfData 中搜索。
您需要實現什么是一個簡單and
標准(我假設你想and
你的搜索語義。
我將向您展示這種方法適用於您的應用程序中的任何其他類似搜索。
想象一下你有一個類Data
像這樣:
data class Data(val a: String? = null, val b: String? = null, val c: String? = null)
讓我們引入一個謂詞類型,它只是函數的別名:
typealias Predicate<T> = T.() -> Boolean
因此,檢查Data
類的屬性a
的謂詞可能如下所示:
val isASomething : Predicate<Data> = { a == "something" }
val data = Data(a = "something")
data.isASomething() // true
由於我們想要and
語義,讓我們創建一個輔助函數,它將任意數量的謂詞與邏輯and
組合在一起:
fun <T> and(vararg predicates: Predicate<T>): Predicate<T> {
return predicates.fold({ true }) { previous: Predicate<T>, next: Predicate<T> ->
{
previous() && next()
}
}
}
綜上所述,您可以編寫一個方法,使用您的標准組件來搜索對象列表:
fun List<Data>.findByProps(aQuery: String? = null, bQuery: String? = null, cQuery: String? = null): List<Data> {
val predicates = mutableListOf<Predicate<Data>>()
if (aQuery != null) predicates += { a == aQuery }
if (bQuery != null) predicates += { b == bQuery }
if (cQuery != null) predicates += { c == cQuery }
if (predicates.isEmpty()) throw IllegalArgumentException("At least one query must have a value")
val criteria = and(*predicates.toTypedArray())
return this.filter { it.criteria() }
}
讓我們測試一下:
val data = listOf(
Data("a", "b", "c"),
Data("a", "1", "2"),
Data("a", "1", "c")
)
println(data.findByProps(aQuery = "a")) // [Data(a=a, b=b, c=c), Data(a=a, b=1, c=2), Data(a=a, b=1, c=c)]
println(data.findByProps(bQuery = "1")) // [Data(a=a, b=1, c=2), Data(a=a, b=1, c=c)]
println(data.findByProps(aQuery = "a", cQuery = "c")) // [Data(a=a, b=1, c=2), Data(a=a, b=1, c=c)]
您現在可以輕松地將這種方法應用於您的案例:
class Contact {
...
}
fun List<Contact>.search(startDateQuery: String? = null, endDateQuery: String? = null, whereMetQuery: String? = null, eventNameQuery: String? = null, productQuery: String? = null, serviceQuery: String? = null) {
val predicates = mutableListOf<Predicate<Contact>>()
if (startDateQuery != null) predicates += { startDate == startDateQuery }
if (endDateQuery != null) predicates += { endDate == endDateQuery }
if (whereMetQuery != null) predicates += { whereMet == whereMetQuery }
if (eventNameQuery != null) predicates += { eventName == eventNameQuery }
if (productQuery != null) predicates += { product == productQuery }
if (serviceQuery != null) predicates += { service == serviceQuery }
if (predicates.isEmpty()) throw IllegalArgumentException("At least one query must have a value")
val criteria = and(*predicates.toTypedArray())
return this.filter { it.criteria() }
}
並使用它:
val contacts : List<Contact> = getContacts()
val metAtHall = contacts.search(whereMetQuery = "Hall")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.