繁体   English   中英

如何在 kotlin 中生成功能样式的列表?

[英]How can I generate a list in a functional style in kotlin?

我正在研究一个 function ,它将收到一个预订列表,每个预订都包含一个 unix 时间戳。

我正在使用 function 作为浏览器,其中每个页面都包含一个 recyclerview,所以我想为当天和最后一次预订当天之间的所有天创建一个天列表。

每一天都有它的一天和一个预订列表,也可以是空的。

我想以功能样式创建日期列表,我真的不知道如何,但我很确定 kotlin 有一些不错的功能隐藏在某个地方供我执行。

先感谢您。 :)

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

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
}

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

请注意,我在 Java 和 Kotlin - LocalDate class 中使用了更现代(也是首选)的日期处理方式。 我已经包含了一个 function 来将毫秒转换为 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()
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM