除了使用match
之外,getOrElse
或Right
值的实际内容是否有类似于选项的方式?
Left
答案 0 :(得分:13)
Nicolas Rinaudo关于在getOrElse
或left
投影上致电right
的答案可能最接近Option.getOrElse
。
或者,你可以fold
:
scala> val x: Either[String,Int] = Right(5)
x: Either[String,Int] = Right(5)
scala> val a: String = x.fold(l => "left", r => r.toString)
a: String = 5
由于l
未在上述折叠中使用,您还可以撰写x.fold(_ => "left", r => r.toString)
修改强>
实际上,您可以通过Option.getOrElse
或toOption
投标left
来确切地right
,例如,
scala> val o: Option[Int] = x.right.toOption
o: Option[Int] = Some(5)
scala> val a: String = o.map(_.toString).getOrElse("left")
a: String = 5
答案 1 :(得分:11)
我并不特别喜欢Either
,因此我对此并不十分熟悉,但我相信您正在寻找预测:either.left.getOrElse
或either.right.getOrElse
。< / p>
请注意,投影也可用于理解。这是一个直接来自文档的例子:
def interactWithDB(x: Query): Either[Exception, Result] =
try {
Right(getResultFromDatabase(x))
} catch {
case ex => Left(ex)
}
// this will only be executed if interactWithDB returns a Right
val report =
for (r <- interactWithDB(someQuery).right) yield generateReport(r)
if (report.isRight)
send(report)
else
log("report not generated, reason was " + report.left.get)
答案 2 :(得分:2)
在Scala 2.12中,有getOrElse
方法可以获得&#34;对&#34;但是你不能将它用于&#34; left&#34;价值直接。但是,您可以这样做:e.swap.getOrElse(42)
。
答案 3 :(得分:0)
在两侧输入A
,即Either[A, A]
,我们可以使用Either.merge
...从两个实例中提取值,无论它们是否为 左或右。
请注意,如果左右类型不同,则结果将变为Any
:
val e: Either[Int, String] = Right("hello")
e.merge // hello: Any