You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Kotlin扩展函数作为参数传递给sort函数?

问题说明

现有针对List<Track>的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 }
}

需要将这两个扩展函数作为参数传入sort函数,同时调整sort函数的参数定义,以及修改sortByTitle、sortByArtist对sort的调用方式。当前相关函数代码如下:

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) {
    val remote = playlist.get(owner, kind)
    val tracks = // 调用扩展函数: remote.tracks.sortByTitle()
    // ...
}
解决方案

1. 调整sort函数的参数定义

给sort函数添加一个函数类型参数,类型为(List<Track>) -> List<Track>——Kotlin的扩展函数本质是接收目标类型作为第一个参数的普通函数,这个类型正好匹配扩展函数的签名。修改后的sort函数:

private fun sort(owner: String, kind: String, sortFunction: (List<Track>) -> List<Track>) {
    val remote = playlist.get(owner, kind)
    val tracks = sortFunction(remote.tracks)
    // ... 后续逻辑
}

2. 在sortByTitle和sortByArtist中传递扩展函数

使用Kotlin的函数引用语法(双冒号::)直接传递扩展函数的引用:

fun sortByTitle(owner: String, kind: String) {
    sort(owner, kind, ::sortByTitle)
}

fun sortByArtist(owner: String, kind: String) {
    sort(owner, kind, ::sortByArtist)
}

完整代码示例

// 原扩展函数保持不变
fun List<Track>.sortByTitle(): List<Track> {
    return this.sortedBy { it.title }
}

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

// 修改后的调用函数
fun sortByTitle(owner: String, kind: String) {
    sort(owner, kind, ::sortByTitle)
}

fun sortByArtist(owner: String, kind: String) {
    sort(owner, kind, ::sortByArtist)
}

// 修改后的核心sort函数
private fun sort(owner: String, kind: String, sortFunction: (List<Track>) -> List<Track>) {
    val remote = playlist.get(owner, kind)
    val tracks = sortFunction(remote.tracks)
    // ... 处理排序后的tracks逻辑
}

补充写法(可选)

如果希望在sort函数内部用更贴近扩展函数的语法调用,可以把参数类型定义为带接收者的函数类型List<Track>.() -> List<Track>,此时传递函数引用的方式不变,调用时可以写成:

private fun sort(owner: String, kind: String, sortFunction: List<Track>.() -> List<Track>) {
    val remote = playlist.get(owner, kind)
    val tracks = remote.tracks.sortFunction()
    // ...
}

这种写法更符合扩展函数的调用习惯,两种方式都能实现需求,可根据偏好选择。

内容的提问来源于stack exchange,提问作者Viewed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 21:15:33