获得任何一个的价值

时间:2013-10-21 20:03:36

标签: scala either

除了使用match之外,getOrElseRight值的实际内容是否有类似于选项的方式?

Left

4 个答案:

答案 0 :(得分:13)

Nicolas Rinaudo关于在getOrElseleft投影上致电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.getOrElsetoOption投标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.getOrElseeither.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