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

