请注意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)
}
}
答案 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
...)