簡體   English   中英

使用可變變量編寫while循環的功能方法

[英]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 (在StreamStream.iterate對象中):根據起始值和增量函數延遲構建無限流
  • Stream#takeWhile (在Stream類中):僅從給定流中獲取與給定謂詞相匹配的元素(測試每個元素並返回true / false函數)。

請注意,我將返回類型轉換為Seq[LocalDateTime]以向調用者隱藏實現細節。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM