2017-01-27 8 views
2

У меня есть функция (я удалил тип, потому что я больше озабочен тем, как собрать все вместе):Как чисто проверить функции входов и возвращают будущее в Scala

def func(opt1: Option, opt2: Option) = Future { 
    for { 
    o1 <- opt1 
    o2 <- opt2 
    } functionThatReturnsAFuture(o1, o2) 
    Future.successful() 
} 

Я пытаюсь подтвердите параметры, а затем вызовите мою функцию, которая возвращает будущее, но я не знаю, как это сделать в идиоматической scala.

Если я это сделать:

def func(opt1: Option, opt2: Option) = Future { 
    for { 
    o1 <- opt1 
    o2 <- opt2 
    } yield functionThatReturnsAFuture(o1, o2) 
} 

это, естественно, будет возвращать вариант [будущее].

Я мог бы также сделать opt1.flatMap(opt2.map(functionThatReturnsAFuture)).sequence, но это все еще довольно уродливо.

Есть ли какой-нибудь идиоматический scala (или scala + cats) способ сделать валидацию таким образом и вернуть будущее?

Спасибо!

+0

Лично я хотел бы пойти на 'getOrElse (Future.failed) ' – nmat

ответ

2

Вы можете решить это, используя Scala элегантно. В любом случае вам нужно обработать случай, в котором один из параметров - ни один, или обе опции не равны.

Возврат невозможен. Будущее в случае, если одно или оба значения не равны.

case class NoneFoundException(msg: String) extends Exception(msg) 

def func(opt1: Option, opt2: Option) = { 
val result = 
    for { 
    value1 <- opt1 
    value2 <- opt2 
    } yield someFutureReturningFunction(value1, value2) 

result.getOrElse { 
    Future.failed(NoneFoundException("one or both of opt1, opt2 are none.")) 
} 

} 

Связь с типами вместо исключений

sealed trait Result[+A] 

case class ReturnedValue[+A](value: A) extends Result[A] 

case class NoneFound extends Result[Nothing] 

def func(opt1: Option, opt2: Option) = { 
    val result = 
    for { 
    o1 <- opt1 
    o2 <- opt2 
    } functionThatReturnsAFuture(o1, o2).map(value => ReturnedValue(value)) 

    result.getOrElse { 
    NoneFound 
    } 

} 

Теперь тип возвращаемого значения функции в будущем вместо варианта Будущего