我试图计算自特定时段开始日期以来各个日期的时间。计算日期以来很简单,但如果它们之间的日期为负,我还希望函数返回-1。我不确定干净的方法吗? 我有:
def getTimeBetween(date1: String, date2: String, format: String, dtype: String): Int = {
dtype match {
case "fixed" => {
if (date1 == null) throw new Exception("Specify date1")
else Days.daysBetween(date2, date1).getDays()
}
case _ => throw new Exception("Enter a valid type")
}
}
我对Scala很陌生,所以我还不太了解所有语法。我更习惯于Java / C ++,所以我想下一步if / else语句是否可行,但我已经意识到它不是可行的方法。
感谢。
答案 0 :(得分:1)
一个明确的改进是不抛出运行时异常,而是依赖于标准的Scala结构,Try
会浮现在这里。
import scala.util.{ Success, Failure, Try }
import org.joda.time.Days
def getTimeBetween(date1: String, date2: String, format: String, dtype: String): Try[Int] = {
dtype match {
case "fixed" => {
Try(Days.daysBetween(date2, date1).getDays) match {
case Success(days) if days >= 0 => Success(days)
case Success(_) => Success(-1)
case Failure(t) => Failure(t)
}
}
case _ => Failure(new IllegalArgumentException)
}
}
此方法会返回Success(#days)
,如果它们是肯定的,则返回它们之间的天数,如果它们是负数,则返回Success(-1)
。
Try
函数周围的daysBetween
包装器将捕获解析期间可能抛出的任何异常,例如参数中的非法格式或null
值。任何运行时异常都会导致Failure(t)
t
被捕获异常。
还有很多其他方法可以解决此问题,例如Either
类型,或使用Option
和scala.util.catching
函数。
修改强>:
因为你离开了你的例子,我也做了,但是对于编译的daysBetween
方法,你需要使用DateTime.parse(date1)
之类的东西将字符串解析为DateTime对象。
答案 1 :(得分:0)
假设您的方法返回一个负整数,并且您希望它返回-1而不是所有负值,您只需将其放入辅助变量并检查
val res = Days.daysBetween(date2, date1).getDays()
if (res <0) -1 else res
只有Int的更紧凑(并且可以说是不太清晰的方法)才会使用max
Days.daysBetween(date2, date1).getDays().max(-1)