在字段中应用多个搜索

问题描述 投票:-1回答:1
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搜索。

java kotlin
1个回答
1
投票

你需要实现的是一个简单的and标准(我假设你想要搜索and语义。

我将向您展示这种方法,您可以在您的应用中使用此类搜索。

想象一下,你有一个类Data像这样:

data class Data(val a: String? = null, val b: String? = null, val c: String? = null)

让我们介绍一个谓词类型,它只是函数的别名:

typealias Predicate<T> = T.() -> Boolean

因此,检查a类的属性Data的谓词可能如下所示:

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")
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.