我正在Kotlin
列表filter
上工作。假设我有一个Worker
实例的列表,并且我想设计一个函数,该函数根据startAge
和maxSalary
可空参数的条件过滤列表。>
data class Worker(name:String?, age: Int?, salary: Int?){
}
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_VALUE
和null
。但是我认为过滤器中可能存在多种条件检查(即比较日期,字符串相等性检查,评估表达式等),这些条件检查可能并不总是可以用default
值覆盖。我如何摆脱这种故障?
答案 0 :(得分:1)
如果参数为null,则可以使用Elvis运算符?:
将年龄或薪水评估为荒谬的值(Int.MIN_VALUE
或Int.MAX_VALUE
)。
it.age >= (startAge ?: Int.MIN_VALUE) && it.salary <= (maxSalary ?: Int.MAX_VALUE)
如果说startAge
为空,则将it.age
与Int.MIN_VALUE
进行比较,这将始终为真。 maxSalary
也是如此。
但是您还应该决定在it.age
或it.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',
]
]
]);
}
});