Saya sedang mencari cara untuk mengonversi daftar panjang Kontrak Berjangka yang berubah-ubah menjadi Daftar Masa Depan. Saya menggunakan Playframework, jadi pada akhirnya, yang benar-benar saya inginkan adalah a Future[Result]
, tetapi untuk mempermudah, anggap saja Future[List[Int]]
Cara normal untuk melakukan ini adalah dengan menggunakan Future.sequence(...)
tetapi ada twist ... Daftar yang saya berikan biasanya memiliki sekitar 10-20 masa depan di dalamnya, dan tidak jarang salah satu masa depan tersebut gagal (mereka membuat permintaan layanan web eksternal). Alih-alih harus mencoba semuanya jika salah satunya gagal, saya ingin mendapatkan yang berhasil dan mengembalikannya.
Misalnya, melakukan hal berikut tidak berhasil
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
Alih-alih mendapatkan satu-satunya pengecualian, saya ingin dapat menarik 1 dan 3 keluar dari sana. Saya mencoba menggunakanFuture.fold
, tetapi ternyata itu hanya panggilanFuture.sequence
belakang layar.
Terima kasih sebelumnya atas bantuannya!
.recover
memang bagian yang hilang untukku._.collect{ case Success(x) => x}
alih-alih_.filter(_.isSuccess)
menyingkirkanTry
dalam jenisfutureListOfSuccesses
..recover(x => Failure(x))
tidak valid, gunakan.recover({case e => Failure(e)})
sebagai gantinyaScala 2.12 memiliki peningkatan
Future.transform
yang cocok untuk jawaban dengan kode yang lebih sedikit.sumber
Saya mencoba jawaban Kevin, dan saya menemukan kesalahan pada versi Scala saya (2.11.5) ... Saya mengoreksinya, dan menulis beberapa tes tambahan jika ada yang tertarik ... ini versi saya>
sumber
Saya baru saja menemukan pertanyaan ini dan memiliki solusi lain untuk ditawarkan:
Idenya di sini adalah bahwa di dalam flip Anda sedang menunggu elemen berikutnya dalam daftar untuk diselesaikan (menggunakan sintaks for -rehension) dan jika yang berikutnya gagal Anda hanya kembali ke apa yang sudah Anda miliki.
sumber
Anda dapat dengan mudah membungkus hasil mendatang dengan opsi dan kemudian meratakan daftar:
sumber
Anda juga dapat mengumpulkan hasil yang berhasil dan tidak berhasil dalam daftar yang berbeda:
sumber