对于以下代码段,IDEA会发出警告,future {None}
将是多余的:
queryString match {
case Some(query) => ... // Do async call
case None => future { None }
}
有更好的可能吗?
答案 0 :(得分:5)
您可以使用Future.successful[T](result: T)
创建已设置的未来而不会产生闭包,因此Future.successful(None)
可能是您想要的。
由于期货已经区分了成功和失败,而与其类型参数无关,因此,您也可以通过Future.failed(new Exception("No query string"))
发出故障信号,因为您的异步调用也可以省略Some
中的包装。 / p>
答案 1 :(得分:1)
我不知道IDEA的警告在这种情况下是否有用。
你可以通过将匹配推向未来来使其沉默:
future {
queryString match {
case Some(query) => Some(computeResult(query))
case None => None
}
}
(或更简要地说:future { queryString.map(computeResult(_)) }
)
答案 2 :(得分:1)
我认为我自己解决了这个问题:我不需要在我的Future中封装一个Option,因为Future本身也会失败,因此失败就等于无。
现在我只返回一个未来并且:
queryString match {
case Some(query) =>
//async Call which returns a Future without Option
case None => throw new Exception("Error")
}