我正在寻找一种方法将Futures的任意长度列表转换为List of Future.我正在使用Playframework,所以最终,我真正想要的是Future[Result],但为了简化,我们只是说Future[List[Int]]这样做的正常方法是使用Future.sequence(...)但是有一个扭曲......我给出的列表通常有其中约有10-20个期货,其中一个期货失败并不常见(它们正在制作外部网络服务请求).在其中一个失败的情况下,我不想重试所有这些,而是希望能够获得那些成功的并返回那些.
例如,执行以下操作不起作用
import scala.concurrent._
import scala.concurrent.ExecutionContext.Implicits.global
import scala.util.Success
import scala.util.Failure
val listOfFutures = Future.successful(1) :: Future.failed(new Exception("Failure")) ::
Future.successful(3) :: Nil
val futureOfList = Future.sequence(listOfFutures)
futureOfList onComplete {
case Success(x) => println("Success!!! " + x)
case Failure(ex) => println("Failed !!! " + ex)
}
scala> Failed !!! java.lang.Exception: Failure
Run Code Online (Sandbox Code Playgroud)
我没有得到唯一的例外,而是希望能够将1和3拉出来.我尝试过使用Future.fold,但显然只是Future.sequence在幕后调用.
在此先感谢您的帮助!
我整理了一个简单的搜索表单,搜索框和几个过滤器作为下拉列表.一切都按照您的预期工作,除了我希望行为是当用户将所有内容完全留空(没有搜索查询,没有过滤器)时,他们只是返回所有内容(当然是分页).
我目前通过检测此特例并查询我的本地数据库来实现这一目标,但使用CloudSearch 100%实现这一目标有一些优势.有没有办法构建一个只返回每个文档的分页列表的请求?换句话说,CloudSearch是否相当于"SELECT id FROM x LIMIT n?"
提前致谢!乔
我是Scala的新手,我有一个关于复制案例类的最佳方法的问题,同时保留来自特征的数据.例如,假设我有以下内容:
trait Auditing {
var createTime: Timestamp = new Timestamp(System.currentTimeMillis)
}
case class User(val userName: String, val email: String) extends Auditing
val user = User("Joe", "joe@blah.com")
Run Code Online (Sandbox Code Playgroud)
然后我想创建一个更改了一个参数的新副本:
val user2 = user.copy(email = "joe@newemail.com")
Run Code Online (Sandbox Code Playgroud)
现在,在上面的示例中,属性createTime不会被复制,因为它未在User case类的构造函数中定义.所以我的问题是:假设将createTime移动到构造函数中不是一个选项,获取包含特征值的User对象副本的最佳方法是什么?
我正在使用Scala 2.9.1
提前致谢!乔
我正在尝试使用for表达式迭代列表,然后使用返回Future的实用程序对每个元素进行转换.长话短说,它不编译,我想了解原因.我读了这个类似的问题,这是一个很好的帮助,但我想要做的更简单,更令人困惑的是为什么它不起作用.我正在尝试做类似的事情:
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
val numberList = List(1, 2, 3)
def squareInTheFuture(number: Int): Future[Int] = Future { number * number}
val allTheSquares = for {
number <- numberList
square <- squareInTheFuture(number)
} yield { square }
Run Code Online (Sandbox Code Playgroud)
而我得到的是:
错误:类型不匹配; 发现:scala.concurrent.Future [Int] required:scala.collection.GenTraversableOnce [?] square < - squareInTheFuture(number)^
有人可以帮助我理解为什么这不起作用,最好的选择是什么?