请注意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(版本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
}
Unit类型的表达式与预期的List[String]类型不一致。
这意味着,你说你的函数返回了一个 List[String]
,但实际上你并没有返回任何东西(因此你的函数实际上返回的是 Unit
).
不知道哪个部分需要修复。
要解决这个错误,你需要用你的结果填充一个列表,然后用 return
在函数的最后。
(我不是在讨论方法实现本身,因为那是另一个问题;但正如 @Krzysztof Atłasik 在评论中提到的,你应该避免使用 java.util.Calendar
任何更多...)
注意:正如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个月。