Scala 获取从给定月份开始的最近12个月的列表。

问题描述 投票:0回答:1

请注意scala初学者的问题。我想从选定的月份获取过去12个月的列表。但是下面的代码出现了错误。Unit类型的表达式不符合预期的List[String]类型。

不知道哪个部分需要修复。任何帮助将是非常感激的。谢谢。

 def getlistofmonths(currentmonth: String): List[String] = {
    //val currentmonth="202006"

    val monthDate = new SimpleDateFormat("yyyyMM")
    val cal: Calendar = Calendar.getInstance

    cal.setTime(monthDate.parse(currentmonth))

    for (x <- 1 until 12) {
      monthDate.format(cal.getTime).toList
      cal.add(Calendar.MONTH, -1)
    }

  }
java scala java-time
1个回答
4
投票

除非你使用的是非常老的Java(版本7或以下),否则你不应该使用 Calendar. 它是可以改变的,而且有更好的选择。YearMonthjava.time:

import java.time.LocalDate
import java.time.format.DateTimeFormatter

def getlistofmonths(currentmonth: String): List[String] = {

  val monthDate = DateTimeFormatter.ofPattern("yyyyMM")

  val start = YearMonth.parse(currentmonth, monthDate)

  (1 to 12).map(x => start.minusMonths(x).format(monthDate)).toList

}

0
投票

Unit类型的表达式与预期的List[String]类型不一致。

这意味着,你说你的函数返回了一个 List[String],但实际上你并没有返回任何东西(因此你的函数实际上返回的是 Unit).

不知道哪个部分需要修复。

要解决这个错误,你需要用你的结果填充一个列表,然后用 return 在函数的最后。

(我不是在讨论方法实现本身,因为那是另一个问题;但正如 @Krzysztof Atłasik 在评论中提到的,你应该避免使用 java.util.Calendar 任何更多...)


0
投票

注意:正如Krzysztof Atłasik所建议的那样,只有在Java 7之前或旧版本中才使用这个解决方案。我的解决方案解释了为什么你需要新的日历实例,因为它是可突变的。

import java.text.SimpleDateFormat
import java.util.{Calendar}

val currentmonth = "202006"

def getlistofmonths(currentmonth: String): List[String] = {
  //val currentmonth="202006"

  (1 to 12)
    .map(e => {
      val monthDate = new SimpleDateFormat("yyyyMM")
      val cal: Calendar = Calendar.getInstance
      cal.setTime(monthDate.parse(currentmonth))
      cal.add(Calendar.MONTH, -e)
      monthDate.format(cal.getTime)
    })
    .toList

}
getlistofmonths(currentmonth)

因为在你的代码中,同一个对象被突变了,你不能使用同一个日历实例。因此,作为上面代码的一部分,它将创建一个日历实例,并给你返回必要的过去12个月。

© www.soinside.com 2019 - 2024. All rights reserved.