gpt4 book ai didi

scala - 使用可变变量编写 while 循环的函数式方法

转载 作者:行者123 更新时间:2023-12-02 08:12:57 26 4
gpt4 key购买 nike

我需要获取一个集合,该集合应填充某些输入和 LocalDatetime.now 之间的日期时间间隔。

示例:

如果我想每 30 分钟建立一个间隔,它应该类似于 2017-06-12 00:30、2017-06-12 01:00、2017-06-12 01:30 ,2017-06-12 02:00..继续

我编写了一段代码来满足我的要求,但它看起来像使用 Scala 语法的 Java - 不是一种功能性且更简洁的方式。

  val now = LocalDateTime.now
val dates = if (interval.toInt > 0) {
var tempDate = LocalDate.now.atStartOfDay()
val allDates = scala.collection.mutable.ListBuffer[String]()
while (tempDate.isBefore(now)) {
allDates += tempDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"))
tempDate = tempDate.plusMinutes(interval.toInt)
}
allDates
} else {
var initialDay = LocalDate.now.minusDays(30)
val allDates = scala.collection.mutable.ListBuffer[String]()
while (initialDay.isBefore(LocalDate.now)) {
allDates += initialDay.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))
initialDay = initialDay.plusDays(1)
}
allDates
}

如何重构此代码以使其看起来像函数式风格或至少删除该可变变量?

最佳答案

您应该使用 Scala 的 Stream 类型从开始日期开始以半小时为增量构建延迟流,然后延迟地仅获取早于停止日期的日期。例如:

def halfHoursFrom(start: LocalDateTime): Seq[LocalDateTime] =
Stream
.iterate(start)(_.plusMinutes(30))
.takeWhile(_.isBefore(LocalDateTime.now))

您可以在标准库引用中找到 Stream 类型的文档。我们在这里使用的两个值得注意的方法是:

  • Stream.iterate(在 Stream 伴随对象中):从起始值和增量函数延迟构建无限流
  • Stream#takeWhile(在 Stream 类中):仅从给定流中获取与给定谓词匹配的元素(测试每个元素并返回 true/false)。

请注意,我将返回类型向上转换为 Seq[LocalDateTime] 以向调用者隐藏实现细节。

关于scala - 使用可变变量编写 while 循环的函数式方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44504786/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com