У меня есть набор операций, которые выполняются последовательно, но если промежуточная последовательность возвращает «ноль», я хотел бы прервать операцию раньше (пропустите последующие шаги).
Я создал такую функцию, которая задала входной параметр, выполняет несколько операций с Redis и возвращает продукт, если он существует. Поскольку возможно, что один из промежуточных запросов вернет нулевое значение, завершенная операция может завершиться сбоем, и я хотел бы закорачивать ненужные шаги, которые будут выполнены позже.
Вложение здесь становится сумасшедшим, и я хотел бы сделать его более разборчивым. Есть ли правильный «функциональный» способ для выполнения этого типа "if/else"
короткого замыкания?
def getSingleProduct(firstSku: String): Option[Product] = {
val jedis = pool.getResource
val sid: Array[Byte] = jedis.get(Keys.sidForSku(firstSku, sectionId, feedId).getBytes)
Option(sid).flatMap {
sid: Array[Byte] =>
Option(jedis.get(Keys.latestVersionForSid(sectionId, feedId, sid))) flatMap {
version: Array[Byte] =>
Option(Keys.dataForSid(sectionId, feedId, version, sid)) flatMap {
getDataKey: Array[Byte] =>
Option(jedis.get(getDataKey)) flatMap {
packedData: Array[Byte] =>
val data = doSomeStuffWith(packedData)
Option(Product(data, "more interesting things"))
}
}
}
}
}