2016-07-05 2 views
3

Я хотел бы найти некоторый объект (Fight) в БД и на основе его присутствия вернуть этот конкретный объект или создать новый объект в БД и вернуть вновь созданный объект. Я реализовал следующую функцию:Будущее будущего Scala

def findOrCreateFight(firstBoxer: BoxersRow, secondBoxer: BoxersRow, eventDate: java.sql.Date): Future[FightsRow] = { 
    for { 
    fight <- findByBoxersAndDate(firstBoxer, secondBoxer, eventDate) 
    } yield { 
    fight match { 
     case Some(f) => f 
     case None => createAndFindFight(firstBoxer, secondBoxer, eventDate) 
    } 
    } 
} 

функция findByBoxersAndDate возвращает будущее [Опция [FightsRow]] объекта и функция возвращает createAndFindFight Future [FightsRow]. Теперь компилятор показывает ошибку в строке с функцией createAndFindFight:

тип несоответствие; найдено: scala.concurrent.Future [models.Tables.FightsRow] требуется: models.Tables.FightsRow

КИ, так что мне нужно, чтобы получить законченный результат этого будущего в 'случае None'. Я думал о функции onComplete, но он возвращает Unit, а не желаемый объект FightsRow. Любое предложение, как исправить мою функцию, чтобы иметь лучший эффект scala-able? :)

С наилучшими пожеланиями

ответ

1

Я добавил незначительные улучшения в Patryk Ćwiek idea:

def findOrCreateFight(first: BoxersRow, second: BoxersRow, date: java.sql.Date): Future[FightsRow] = 
    findByBoxersAndDate(first, second, date).flatMap { 
    case None => createAndFindFight(first, second, date) 
    case Some(row) => Future.successful(row) 
    } 
+0

Он работает! Я очень ценю вашу помощь! – Gandalf

+0

@ Gandalf Ваш следующий шаг - поднять полезные ответы и принять лучший. –

3

Хорошо, так что вы получите из createAndFindFight будет другой Future. Решение? flatMap это, но вам придется довольно много 'конвертировать & развертку' Option к соответствующему типу:

findByBoxersAndDate(firstBoxer, secondBoxer, eventDate) 
    .flatMap(_.map(Future.successful).getOrElse(createAndFindFight(firstBoxer, secondBoxer, eventDate))) 

или непосредственно соответствовать вашему для-понимания:

for { 
    potentialFight <- findByBoxersAndDate(firstBoxer, secondBoxer, eventDate) 
    actualFight <- potentialFight match { 
     case Some(f) => Future.successful(f) 
     case None => createAndFindFight(firstBoxer, secondBoxer, eventDate) 
    } 
} yield actualFight 

Отказ от ответственности: код выше не проверен :)

+0

Это работает! Большое спасибо за ваше предложение! :) – Gandalf

 Смежные вопросы

  • Нет связанных вопросов^_^