如何进行分组、排序和排序:Kotlin 集合

How to make a grouping, ordering and sorting: Kotlin collection

我正在尝试根据 Kotlin 风格对每个组进行分组、排序和排序,尽可能简洁易读。

我有一个数据class。

enum class LoadingStatus { PROCESSING, SCANNING, FAIL, FINISHED }

data class FileModel(val loadingStatus: LoadingStatus, val fileName: String, val modifiedDate: Long)

我想对 FileModel 的集合进行排序:

项目应按以下顺序从上到下排序:

PROCESSING → SCANNING → FINISHED → OTHER

子排序顺序:

PROCESSING → 按修改时间 (AS)

SCANNING → 按修改时间 (DE)

FINISHED → 按修改时间 (DE)

OTHER → 按名称 (AS)

private fun setupFilesOrder(incomeList: MutableList<FileModel>): MutableList<FileModel> 
= ...

这个怎么样?

fun setupFilesOrder(incomeList: MutableList<FileModel>): MutableList<FileModel> {
    val grouped = incomeList.groupBy { it.loadingStatus }
    return listOf(
        grouped[LoadingStatus.PROCESSING]?.sortedBy { it.modifiedDate }.orEmpty(),
        grouped[LoadingStatus.SCANNING]?.sortedByDescending { it.modifiedDate }.orEmpty(),
        grouped[LoadingStatus.FINISHED]?.sortedByDescending { it.modifiedDate }.orEmpty(),
        grouped[LoadingStatus.FAIL]?.sortedBy { it.fileName }.orEmpty()
    ).flatten().toMutableList()
}

如果你想要更多表达,甚至可以这样:)

fun setupFilesOrder(incomeList: MutableList<FileModel>): MutableList<FileModel> {
    val grouped = incomeList.groupBy { it.loadingStatus }
    infix fun LoadingStatus.sort(block: List<FileModel>.() -> List<FileModel>) =
        grouped[this]?.block().orEmpty()
    return listOf(
        LoadingStatus.PROCESSING sort { sortedBy { it.modifiedDate } },
        LoadingStatus.SCANNING sort { sortedByDescending { it.modifiedDate } },
        LoadingStatus.FINISHED sort { sortedByDescending { it.modifiedDate } },
        LoadingStatus.FAIL sort { sortedBy { it.fileName } }
    ).flatten().toMutableList()
}