繁体   English   中英

Kotlin-将sortBy参数作为函数参数传递

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM