Поскольку MyOtherType
принимает последовательность, вы можете создать последовательность запросов и сопоставить ее с результатом:
Future.sequence(List(
repo.queryForThing1().map(_.getOrElse(MyType("1", 1, 7))),
repo.queryForThing2().map(_.getOrElse(MyType("2", 2, 6))),
repo.queryForThing3().map(_.getOrElse(MyType("3", 3, 5))),
repo.queryForThing4().map(_.getOrElse(MyType("4", 4, 4))),
repo.queryForThing5().map(_.getOrElse(MyType("5", 5, 3))),
repo.queryForThing6().map(_.getOrElse(MyType("6", 6, 2))),
repo.queryForThing7().map(_.getOrElse(MyType("7", 7, 1)))
)).map(MyOtherType)
Однако это отличается от исходного кода тем, что он выполняет все запросы нав то же время, а не последовательно, и не остановится рано, если один из запросов завершится неудачей.
Тот факт, что у вас есть семь разных запросов и семь разных значений по умолчанию, означает, что вам придется записывать их по отдельности, так чтоэто всегда будет выглядеть немного грязно.
Для справки, вот версия, которая выполняет запросы последовательно, а не параллельно, но это не красиво!
val queries =
List(
repo.queryForThing1 _ -> MyType("1", 1, 7),
repo.queryForThing2 _ -> MyType("2", 2, 6),
repo.queryForThing3 _ -> MyType("3", 3, 5),
repo.queryForThing4 _ -> MyType("4", 4, 4),
repo.queryForThing5 _ -> MyType("5", 5, 3),
repo.queryForThing6 _ -> MyType("6", 6, 2),
repo.queryForThing7 _ -> MyType("7", 7, 1)
)
queries.foldLeft(Future.successful(Vector.empty[MyType])) {
case (prev, (query, default)) =>
prev.flatMap(p => query().map(q => p :+ q.getOrElse(default)))
}.map(MyOtherType)