如何在 kotlin 中生成函数式风格的列表?

mam*_*ama 0 functional-programming list kotlin

我正在开发一个函数,该函数将接收预订列表,并且每个预订都包含一个 unix 时间戳。

我正在使用 viewpager 的功能,其中每个页面都包含一个 recyclerview,因此我想创建一个天数列表,包含当前日期和上次预订日期之间的所有日期。

每天都有自己的日期和预订列表,该列表也可以为空。

我想以函数式风格创建日期列表,我真的不知道如何做,但我很确定 kotlin 有一些不错的功能隐藏在某处供我执行。

先感谢您。:)

这是我的函数的样子,以及我在其中使用的模型。

data class Day(val date:Date, val bookings: List<Bookink>)
data class Booking(val id:String, val time:Long, val user:User)

fun dates(bookings: List<Booking>): List<Day> {
    val lastDate = Date(bookings.last().time)
    val days = ArrayList<Day>()
    val cal = GregorianCalendar()
    cal.time = Date()

    while (cal.time.before(lastDate)) {
        days.add(Day(cal.time, bookings.filter { (Date(it.time) == cal.time) }))
        cal.add(Calendar.DATE, 1)
    }

    return days
}
Run Code Online (Sandbox Code Playgroud)

小智 5

假设您希望看到针对您的问题的更实用的解决方案,您需要创建一个在结束日期之前包含一天步骤的序列。之后,每一天都会映射到相应的 Day 对象以及经过过滤的预订列表。

请注意,我在 Java 和 Kotlin 类中使用了更现代(也是首选)的日期处理方式LocalDate。我已经包含了一个将毫秒转换为 LocalDate 的函数 -Long.toLocalDate

fun dates(bookings: List<Booking>): List<Day> {
    val startDate = LocalDate.now()
    val endDate = bookings.last().time.toLocalDate()

    return generateSequence(startDate) { it.plusDays(1) }
       .takeWhile { it.isBefore(endDate) }
       .map { day -> Day(day, bookings.filter { it.time.toLocalDate() == day }) }.toList()
}

private fun Long.toLocalDate(): LocalDate {
    return Instant.ofEpochMilli(this)
        .atZone(ZoneId.systemDefault())
        .toLocalDate()
}
Run Code Online (Sandbox Code Playgroud)