[英]Kotlin - passing sortBy params as function parameter
假设您有一堂课:
class Person{
var age :Int?
var name :String?
}
然后您有了此类的集合,我们称其为people:List。 您可以将sort称为:
people.sortBy{person -> person.age}
要么
people.sortBy{person -> person.name}
我想知道是否有可能编写按给定字段排序的函数定义? 如:
fun sortbyField(field:???){
peple.sortBy{field}
}
我不知道如果可能的话,如何定义“ field”参数。 谢谢!
您可以使用接收器 (例如Person.() -> T
使函数参数接受函数类型 ,然后,在传递给该函数的lambda主体内部,可以访问隐式接收器的属性:
fun <T : Comparable<T>> sortUsing(fn: Person.() -> T) {
people.sortBy { it.fn() }
}
用途:
sortUsing { name }
sortUsing { age }
或者,您可以将可调用的引用作为函数参数而不是lambda传递给该属性:
people.sortBy(Person::name)
people.sortBy(Person::age)
这适用于接受单个参数(Person) -> T
的功能参数,以及具有接收器Person.() -> T
功能参数。
也许以下是您正在寻找的东西:
fun List<Person>.sortByHeader(header: String) = sortedWith(
when (header) {
"header_name" -> compareBy(nullsFirst(), Person::name)
"header_age" -> compareBy(nullsLast(), Person::age)
"header_time" -> compareBy(Person::time)
else -> compareBy(Person::id)
}
)
我改用以下数据类:
data class Person(val id: Int, val name: String?, val age : Int?, val time: LocalDateTime)
这样,您就可以使用标题名称来调用它,例如:
pepple.sortByHeader("header_id").run(::println)
pepple.sortByHeader("header_name").run(::println)
pepple.sortByHeader("header_time").run(::println)
pepple.sortByHeader("header_age").run(::println)
我只是添加了一些nullsFirst / nullsLast,以防您也想使用类似的东西。
如果那不是您想要的,那么使用带有接收器的功能( 如热键答案所示)可能更适合您。 下一个选择是使用反射,但是我将省略此反射,因为应该将其用作最后的手段。
如果不将函数作为lambda表达式调用,则可以简单地将字段用作参数:
people.sortedBy(Person::name)
另一种写法
people.sortBy { it.name }
在kotlin中,当lambda只需要一个参数时,可以简化语法: people.sort { it -> it.name }
people.sort { it.name }
people.sort { it -> it.name }
变成people.sort { it.name }
。 您必须使用it
的名字
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.