2014-12-25 4 views
2

Иногда у меня есть Option[Future[T]] val. И я хочу иметь дело с этим:Scala. Лучший способ развернуть вариант [Future [T]]

do.something /* Option[A] here */ map { v => // v is of type A here 
    doComplexCalculation(v) // it returns Future[T] 
} map { v => // I want to get T here, after future becomes resolved. 
      // But here is Future[T] and I shoud do that: 
    v map { v => // v is of type T here. 

    } 
} 

Плохая вещь, с моей точки зрения, является повышение уровня вложенности. Я хочу, чтобы иметь более плоский код :) один из techinc, что я нашел, это:

do.something /* Option[A] here */ map { v => // v is of type A here 
    doComplexCalculation(v) // it returns Future[T] 
} getOrElse { 
    Future.failed(/* And I should pass Throwable here */) 
} map { v => // v is of type T here 

} 

Не могли бы вы показать мне лучший способ сделать это? Вещи, которые мне не нравится в мое решение:

  1. я должен создать не удалось будущее вручную
  2. я должен создать Throwable вручную
+1

Если это так, не используйте 'Option'. Просто 'Future [T]' кажется достаточно. Кажется, что если 'Option' является' None', вы будете реагировать, возвращая неудавшееся «Будущее». Таким образом, этот дополнительный уровень начала ('Option' of' Future') не нужен. –

+0

Я не могу изменить 'do.something'. Но спасибо, я подумаю об этом в своем новом коде. –

ответ

0

почему ваш do.something возвращает вариант, чтобы начать с ? Если вы хотите потерпеть неудачу в случае отсутствия, то почему это не делает.что-то просто бросить или, возможно, вернуть Try? Тогда вы можете просто сделать

doComplexCalculation(do.something.get).map { v: T => 
    ... 
} 
+0

Это неприемлемо, так как 'do.something' может быть длинным кодом, например: something.map {} map {} map {} map (doComplexCalculation) –

+0

Поместите этот код с длинной цепочкой в ​​функцию – Dima

0

Я думаю, что следующий код является лучшим выбором в вашем случае

def doSomething[A](): Option[A] = ??? 
def complexCalculation[T](): Future[T] = ??? 

def someMethod() = { 
    val resOption = doSomething() 
    resOption match{ 
    case Some(res) =>{ 
     complexCalculation() map{ result => 
     println("Future successfully resolved so print res=" + res.toString) 
     } 
    } 
    case None => println("doSomething returned None") 
    } 
} 
+0

Спасибо за ваше участие, но это неприемлемо, потому что у него есть те же недостатки: увеличение уровня вложенности. ИМО, мой второй пример лучше. –

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