Андрей отвечает правильно, но логику также можно записать с помощью оператора for
:
(for {
data <- Option(getData) if someTest(data)
d = doSomething(data)
e = doWork(d) if someTest2(e)
} yield {
Map(A() -> B())
}).getOrElse(Map.empty)
Это сохраняет немного больше оригинальной формы кода, но это вопрос вкуса, какую версию использовать. Вы также можете поместить if
в отдельную строку, если это делает его более понятным.
Обратите внимание, что я сохранил значения d
и e
в предположении, что они действительно значимы в реальном коде. Если нет, то может быть одно if
выражение, которое выполняет все тесты, как отмечено в других ответах:
(for {
data <- Option(getData)
if someTest(data) && someTest2(doWork(doSomething(data)))
} yield {
Map(A() -> B())
}).getOrElse(Map.empty)