如何在Kotlin中使用可选参数高效过滤?

时间:2019-06-21 05:30:27

标签: android list kotlin filter mapping

我正在Kotlin列表filter上工作。假设我有一个Worker实例的列表,并且我想设计一个函数,该函数根据startAgemaxSalary 可空参数的条件过滤列表。

数据类

data class Worker(name:String?, age: Int?, salary: Int?){

}

函数filteredList()

fun filterList(original: List<Worker>, startAge: Int?, maxSalary: Int?): List<Student>{
    val list = original.filter{
        it.age >= startAge && it.salary <= maxSalary
    }
    return list
}

在这一点上,我想以这样一种方式设计filterList函数:如果将任何参数作为null传递,则不应跳过该条件。我怎么做?例如,使用

val list = filterList(original, null, 100)应返回最大薪水为100但年龄无关的工人清单。

我的想法

在此特定问题中,当startAge = Int.MAX_VALUE以参数形式传递时,我可以选择默认的maxSalary = Int.MIN_VALUEnull。但是我认为过滤器中可能存在多种条件检查(即比较日期,字符串相等性检查,评估表达式等),这些条件检查可能并不总是可以用default值覆盖。我如何摆脱这种故障?

2 个答案:

答案 0 :(得分:1)

如果参数为null,则可以使用Elvis运算符?:将年龄或薪水评估为荒谬的值(Int.MIN_VALUEInt.MAX_VALUE)。

it.age >= (startAge ?: Int.MIN_VALUE) && it.salary <= (maxSalary ?: Int.MAX_VALUE)

如果说startAge为空,则将it.ageInt.MIN_VALUE进行比较,这将始终为真。 maxSalary也是如此。

但是您还应该决定在it.ageit.salary为空时会发生什么,而您在问题中没有提及。

编辑:

如果没有默认值,则可以使用?.let将可选参数转换为可选布尔值,然后使用?:将其默认设置为true

fun filterList(original: List<Worker>, startAge: Int?, maxSalary: Int?): List<Worker>{
    val list = original.filter{
        (startAge?.let { x -> it.age >= x } ?: true) && (maxSalary?.let { x -> it.salary <= x } ?: true)
    }
    return list
}

答案 1 :(得分:1)

您可以创建一个辅助函数type = "typeA"来检查LIMIT或以其他方式调用谓词:

(SELECT id FROM rank_list LIMIT 1)

使用此功能,您的过滤器语句将如下所示:

add_action('pre_get_posts', function ($query) {
 if (is_admin() || !$query->is_main_query()) return;

 if ($query->is_archive() && $query->is_author()) {

 $author_id = get_query_var('author');

 // extend the main query with these post ids
 $coauthored_posts = get_posts([
 'fields'         => 'ids',
 'posts_per_page' => '-1',
 'post_status'    => 'publish',
 'meta_query' => [
        [
 'key' => 'co_authors',
 'value' => $author_id,
 'compare'   => 'LIKE',
        ]
      ]
    ]);
  }
});