如何传递扩展函数作为参数?

Vie*_*wed 1 kotlin

有扩展功能

fun List<Track>.sortByTitle(): List<Track> {
    return this.sortedBy { it.title }
}

fun List<Track>.sortByArtist(): List<Track> {
    return this.sortedBy { it.artists[0].name }
}
Run Code Online (Sandbox Code Playgroud)

sort为了传递扩展函数,需要在函数的参数中写入什么?

fun sortByTitle(owner: String, kind: String) {
    sort(owner, kind) // pass List<Track>.sortByTitle
}

fun sortByArtist(owner: String, kind: String) {
    sort(owner, kind) // pass List<Track>.sortByArtist
}

private fun sort(owner: String, kind: String) {
    val remote = playlist.get(owner, kind)
    val tracks = // call extension function: remote.tracks.sortByTitle()
    // ...
}
Run Code Online (Sandbox Code Playgroud)

bro*_*oot 5

我们可以使用函数类型传递函数,例如:

fun sortByTitle(owner: String, kind: String) {
    sort(owner, kind, List<Track>::sortByTitle)
}

fun sortByArtist(owner: String, kind: String) {
    sort(owner, kind, List<Track>::sortByArtist)
}

private fun sort(owner: String, kind: String, sortStrategy: List<Track>.() -> List<Track>) {
    val remote = playlist.get(owner, kind)
    val tracks = remote.tracks.sortStrategy()
    // ...
}
Run Code Online (Sandbox Code Playgroud)

在上面的例子中List<Track>.() -> List<Track>意味着:函数是 的扩展List<Track>并返回List<Track>