Scala 2.12 имеет 2 Future.find
методов.
@deprecated("use the overloaded version of this method that takes a scala.collection.immutable.Iterable instead", "2.12.0")
def find[T](@deprecatedName('futurestravonce) futures: TraversableOnce[Future[T]])(@deprecatedName('predicate) p: T => Boolean)(implicit executor: ExecutionContext): Future[Option[T]]
И его перегруженная версия
def find[T](futures: scala.collection.immutable.Iterable[Future[T]])(p: T => Boolean)(implicit executor: ExecutionContext): Future[Option[T]]
Оба они имеют одинаковое описание
/** Asynchronously and non-blockingly returns a `Future` that will hold the optional result
* of the first `Future` with a result that matches the predicate, failed `Future`s will be ignored.
*
* @tparam T the type of the value in the future
* @param futures the `scala.collection.immutable.Iterable` of Futures to search
* @param p the predicate which indicates if it's a match
* @return the `Future` holding the optional result of the search
*/
Таким образом, я предполагаю, что эти методы находят первый завершенный Future
, который соответствует параметру p
в данном Списке
Но только первый действительно делает это.
val start = System.currentTimeMillis
val a = (1 to 3).reverse.iterator.map{ x =>
Future{
Thread.sleep(x * 10000)
x
}
}
val b = Future.find(a)(_.isInstanceOf[Int])
b.foreach{ x =>
println(x)
println(System.currentTimeMillis - start) // 10020
}
Удаленная версия метода возвращает самую быструю версию.
val a = (1 to 3).reverse.map{ x =>
Future{
Thread.sleep(x * 10000)
x
}
}
val b = Future.find(a)(_.isInstanceOf[Int])
b.foreach{ x =>
println(x)
println(System.currentTimeMillis - start)
}
Перегруженная версия возвращает самую медленную версию.Чтобы быть более точным, он просто проверяет заданный список с головы до хвоста, и ему все равно, сколько времени они будут заполнены.
Это так, как должно быть?Если да, то использует ли дублированный вариант или сам его внедряющий вариант, чтобы позаботиться о том, чтобы их время было закончено?