Ich benutze ziemlich oft die folgende Funktion, um Option[Try[_]]
in Try[Option[_]]
umzuwandeln, aber es fühlt sich falsch an. Kann eine solche Funktionalität auf idiomatische Weise ausgedrückt werden?Wie man Option [Try [_]] konvertiert, um [Option [_]] auszuprobieren?
def swap[T](optTry: Option[Try[T]]): Try[Option[T]] = {
optTry match {
case Some(Success(t)) => Success(Some(t))
case Some(Failure(e)) => Failure(e)
case None => Success(None)
}
}
Sagen, ich habe zwei Werte:
val v1: Int = ???
val v2: Option[Int] = ???
Ich möchte eine Operation machen op
auf diesen Werten (die ausfallen können), und dass f
unten an Funktion übergeben.
def op(x: Int): Try[String]
def f(x: String, y: Option[String]): Unit
ich verwenden in der Regel für das Verständnis für die Lesbarkeit:
for {
opedV1 <- op(v1)
opedV2 <- swap(v2.map(op))
} f(opedV1, opedV2)
PS. Ich möchte einige schwere Sachen wie Scalaz vermeiden.
Die Definition von 'swap' vernünftig aussieht. Ich bin mir nicht sicher, was du mehr davon willst. –
Ein Gedanke: Diese Operation wird normalerweise (idiomatisch?) 'Sequenz' genannt und nicht' swap'. –