例外を投げるライブラリを使おうとすると途端に泥臭くなりがちです。
渡された数値で日付を生成するときなど、DateTimeExceptionを考慮しtry-catchで分岐して…などやり始めるとコードの見通しが悪くなります。
####例題
2組の年・月・日の数値から、より未来の日付を導く
コテコテにtry-catch
def dateOrMin(y:Int, m:Int, d:Int): LocalDate = {
try {
LocalDate.of(y,m,d)
} catch {
case _: Throwable => LocalDate.MIN
}
}
val d1 = dateOrMin(2017,0,1)
val d2 = dateOrMin(2017,12,3)
if (d1 == LocalDate.MIN && d2 == LocalDate.MIN){
throw new DateTimeException("どっちも不正な日付です…")
}else if(d1 isAfter d2) {
d1
} else {
d2
}
scala.util.Try
が便利でした
スッキリ
def tryDate(y:Int, m:Int, d:Int): Try[LocalDate] = Try{ LocalDate.of(y,m,d) }
(tryDate(2017,0,1),tryDate(2017,0,1)) match {
case (Success(d1),Success(d2)) => if(d1 isAfter d2) d1 else d2
case (Success(d1),Failure(_)) => d1
case (Failure(_),Success(d2)) => d2
case _ => throw new DateTimeException("どっちも不正な日付です…")
}
TryはtoEither
やtoOption
を備えているので、forの中で扱うにもよいです。