从Scala中选项内的选项提取值

从Scala中选项内的选项提取值,scala,slick,Scala,Slick,鉴于以下情况: val x = Some(Some(1)) 获取1(如果不存在-1)的最干净方法是什么 我正在从数据库查询返回的元组创建一个对象实例。元组中的一个值如下所示,因此我希望使用一个很短的“一行”来获取该值或将参数设置为-1。x.flatte就是您要找的。在这里,它将为您提供一些(1)。 如果您真的想在“一个不存在”的情况下获得-1,只需执行x.flatte.getOrElse(-1): 这就是我想到的: scala> val x = Some(Some(1)) x: Some

鉴于以下情况:

val x = Some(Some(1))
获取1(如果不存在-1)的最干净方法是什么


我正在从数据库查询返回的元组创建一个对象实例。元组中的一个值如下所示,因此我希望使用一个很短的“一行”来获取该值或将参数设置为-1。

x.flatte
就是您要找的。在这里,它将为您提供一些(1)。 如果您真的想在“一个不存在”的情况下获得
-1
,只需执行
x.flatte.getOrElse(-1)


这就是我想到的:

scala> val x = Some(Some(1))
x: Some[Some[Int]] = Some(Some(1))

scala> val y = x.map(_.getOrElse(-1)).get
y: Int = 1

scala> val x = Some(None)
x: Some[None.type] = Some(None)

scala> val y = x.map(_.getOrElse(-1)).get
y: Int = -1
这仅在第一级“有些”不是“无”时有效,尽管不是“一行”,但您可以创建一个函数来提取值。如果您将其设置为泛型并传入默认值,那么它可能非常方便

scala> def fetchFromOptions[A](default: A)(x: Option[Option[A]]) = x match {
     | case Some(Some(a)) => a
     | case _ => default
     | }
fetchFromOptions: [A](default: A)(x: Option[Option[A]])A

scala> fetchFromOptions(-1)(Some(Some(1)))
res0: Int = 1

scala> fetchFromOptions(-1)(Some(None))
res1: Int = -1

如果您确实知道它的
Some(Some(1))
,那么您可以使用无可辩驳的模式匹配表示法:

scala> val ssi1 = Some(Some(1))
ssi1: Some[Some[Int]] = Some(Some(1))

scala> val Some(Some(i1)) = ssi1
i1: Int = 1
如果组合中可能存在任何
None
,那么您必须使用其他人建议的更为谨慎和详细的形式


对于那些认为这是一种奇怪的表示法的人,可以把它看作是你在
案例中写的
匹配
构造或
部分函数
文本来匹配scrutinee,它是
Some(Some(1))
,因为理解通常是使用这类嵌套结构的一种非常可读的方式:

  val x = Some(Some(1))
  val result = for {
    firstLevel <- x
    secondLevel <- firstLevel
  } yield {
    // We've got an int, now transform it!
    (secondLevel * 100).toString
  }
valx=Some(Some(1))
val结果=用于{

第一级扁平化!!!我读过,看过,用过…现在只要记住;-)+1这正是我所走的道路之一;-)那,还有“匹配”,但我知道有一种方法可以简单地实现,但记不起如何实现。扁平化发挥了我一直在寻找的魔力。是的,另一种解决方案显然更好。我也总是忘记一个布特平坦。;-)
  val x = Some(Some(1))
  val result = for {
    firstLevel <- x
    secondLevel <- firstLevel
  } yield {
    // We've got an int, now transform it!
    (secondLevel * 100).toString
  }
  val result2 = for {
    Some(v) <- x
  } yield {
    // We've got a int, now transform it!
    (v * 100).toString
  }