я делаю что-то вроде этого:фильтрация внутри для-понимания с фьючерсами
(for {
data <- Future(getData)
updated = makeChanges(data) if updated != data
_ <- Future(saveUpdates(updated))
_ <- Future(recordTransaction)
} yield()).recover { case e: NoSuchElementException =>() }
Если фильтр не удовлетворен, он пропустит оставшиеся два шага, бросая исключение (не хорошо), что (хорошо!) Я должен поймать и обработать в конце. Использование исключений для управления потоком не чувствует себя слишком элегантно ко мне, хотя, мне интересно, если есть лучший способ сделать это, кроме очевидного - оборачивать все остальные строки с, если заявление:
_ <- if(updated != data) Future(saveUpdates(updated)) else Future.successful(())
_ <- if(updated != data) ...
Если вы можете изменить makeChanges вернуть кортеж (изменено: Boolean, обновление: Data) вы могли бы сопоставление с образцом на нем и решить, какие действия возьмите в этом случае. Это сделало бы его чистым –
@LouisF. не уверен о чем ты. Я могу сопоставлять совпадение на 'updated! = Data' так же легко, но не уверен, как использовать его, чтобы сделать его более чистым. Замените 'if ... else ..' в последнем, отрезаемом' match ... case'? – Dima