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

如何扩展Kotlin泛型排序函数以按对象列表参数数量排序?

支持衍生属性排序的泛型排序函数

你原来的sortColumnData函数只能接收对象的直接Comparable属性引用(比如Book::title),要实现按作者数量排序,只需要把函数的selector参数类型从KProperty1<T, Comparable<*>>改成更通用的函数类型(T) -> Comparable<*>,这样既兼容原来的属性引用用法,又支持自定义的衍生值计算逻辑。

修改后的函数代码

enum class SORTDIRECTION { UP, DOWN }

fun <T> sortColumnData(
    data: List<T>,
    direction: SORTDIRECTION,
    selector: (T) -> Comparable<*>
): List<T> {
    return when (direction) {
        SORTDIRECTION.UP -> data.sortedWith(compareBy(selector))
        SORTDIRECTION.DOWN -> data.sortedWith(compareByDescending(selector))
    }
}

用法示例

  • 按作者数量升序排序:
val sortedByAuthorCountAsc = sortColumnData(books, SORTDIRECTION.UP) { it.authors.size }
  • 按作者数量降序排序:
val sortedByAuthorCountDesc = sortColumnData(books, SORTDIRECTION.DOWN) { it.authors.size }
  • 原来的按标题/年份排序依然可以正常使用:
val sortedByTitle = sortColumnData(books, SORTDIRECTION.UP, Book::title)
val sortedByYear = sortColumnData(books, SORTDIRECTION.DOWN, Book::year)

原理说明

KProperty1<T, Comparable<*>>本身就是(T) -> Comparable<*>的子类,所以修改参数类型后,原来的属性引用写法完全兼容。而新增的lambda写法可以让你灵活计算任何能转换为Comparable类型的值——比如集合的大小、字符串的长度、甚至是多个属性的组合值,只要最终返回的是Comparable实现类(比如Int、String等)就行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 23:55:18