Reputation: 3827
I'm trying to make a grouping, ordering and sorting per each group a collection according to a Kotlin style as much concise and readable way.
I have a data class.
enum class LoadingStatus { PROCESSING, SCANNING, FAIL, FINISHED }
data class FileModel(val loadingStatus: LoadingStatus, val fileName: String, val modifiedDate: Long)
I'd like to sort a collection of FileModel
:
Items are should be sorted in the following order from top to bottom:
PROCESSING → SCANNING → FINISHED → OTHER
SubSorting order:
PROCESSING
→ by time modified (AS)
SCANNING
→ by time modified (DE)
FINISHED
→ by time modified (DE)
OTHER
→ by name (AS)
private fun setupFilesOrder(incomeList: MutableList<FileModel>): MutableList<FileModel>
= ...
Upvotes: 0
Views: 1063
Reputation: 8442
How about this?
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()
}
or even this if you want more expression :)
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()
}
Upvotes: 1