Scala:基于int表达式

时间:2015-05-19 16:20:41

标签: scala

我试图计算自特定时段开始日期以来各个日期的时间。计算日期以来很简单,但如果它们之间的日期为负,我还希望函数返回-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语句是否可行,但我已经意识到它不是可行的方法。

感谢。

2 个答案:

答案 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类型,或使用Optionscala.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)