Предположим, у нас есть 3 метода, которые все возвращают Option
import scala.util.Try
def divideSafe(d: Int): Option[Int] = Try(42 / d).toOption
def sqrtSafe(x: Double): Option[Double] = if(!math.sqrt(x).isNaN) Some(math.sqrt(x)) else None
def convertSafe(s: String): Option[Int] = Try(s.toInt).toOption
Теперь я хочу связать их, пока выполняется условие. В моем случае, если результат предыдущего метода определен, то следует перейти к следующему. И пока условие ложно, остановите операцию и верните значение по умолчанию.
Я могу получить желаемый результат с помощью вложенных операторов if-else:
def superSafe(d: Int, x: Double, s: String): Unit = {
if (divideSafe(d).isDefined) {
println(divideSafe(d).get.toString)
if (sqrtSafe(x).isDefined) {
println(sqrtSafe(x).toString)
if (convertSafe(s).isDefined) {
println(convertSafe(s).get.toString)
} else {
println("Converting failed")
}
} else {
println("Sqrt failed")
}
} else {
println("Dividing failed")
}
}
Таким образом:
superSafe(1, -1, "5")
напечатает 42, и Sqrt потерпел неудачу
superSafe(0, 4, "cat")
будет печатать Разделение не удалось
superSafe(42, 4, 1)
будет печатать 1,2,1
Однако я хочу избежать вложенных операторов if-else и мне интересно, есть ли в Scala функциональный способ решения подобных проблем.
Я хочу что-то вроде orElse
заявления, но наоборот.
Желаемую функцию можно использовать так:
divideSafe(42) ifThen("Dividing failed") sqrtSafe(-4) ifThen("Sqrt failed") convertSafe("cat") ifThen("Converting failed")