[英]Functional way to write while loop with mutable variable
我需要獲得一個集合,該集合應使用某些輸入和LocalDatetime.now
之間的日期時間間隔填充。
例:
如果我要基於每30分鍾建立一個間隔,則應該類似於2017-06-12 00:30, 2017-06-12 01:00, 2017-06-12 01:30, 2017-06-12 02:00..and go on
。
我編寫了滿足我的要求的代碼,但是它看起來像使用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.iterate
對象中):根據起始值和增量函數延遲構建無限流 Stream#takeWhile
(在Stream
類中):僅從給定流中獲取與給定謂詞相匹配的元素(測試每個元素並返回true
/ false
函數)。 請注意,我將返回類型轉換為Seq[LocalDateTime]
以向調用者隱藏實現細節。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.