Scala获取给定月份的最近12个月的列表

时间:2020-06-11 11:36:23

标签: java scala java-time

请注意scala初学者的问题。 我正在尝试获取所选月份的最近12个月的列表。但是下面的代码给出了错误: 单位类型的表达式与预期的类型列表[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)
    }

  }

3 个答案:

答案 0 :(得分:4)

除非您使用的是非常老的Java(版本7或更低版​​本),否则不应该使用Calendar。它是可变的,并且与YearMonth相比有一个更好的选择java.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

}

答案 1 :(得分:0)

注意:正如KrzysztofAtł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个月内将您还给您。

答案 2 :(得分:0)

类型为Unit的表达式与预期的类型List [String]不符

这意味着您已经说过您的函数返回了List[String],但实际上您没有返回任何东西(因此您的函数实际上返回了Unit)。

不确定哪个部分需要修复。

要解决此错误,您需要在列表中填充结果,然后在函数末尾return填充它。

(我不是在解决方法实现本身,因为这将是一个不同的问题;但是正如@KrzysztofAtłasik在评论中提到的那样,您应该避免再使用java.util.Calendar ...)