如何将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
相关产品推荐
相关产品推荐

