Scala 获取可选类字段的值

Scala 获取可选类字段的值,scala,Scala,假设我有一个Toto类,它有两个可选字段: case class Toto(a : Option[Int], b: Option[Int]) 和一个带有一个可选Toto的Titi类: case class Titi(c : Option[Toto]) 我们创建一个类Titi的实例: val test = Titi(Some(Toto(Some(1),Some(2)))) 现在我想通过假设Titi或b可以等于None来访问Titi变量中Toto的第二个字段,但这是不可能的: test.c.g

假设我有一个Toto类,它有两个可选字段:

case class Toto(a : Option[Int], b: Option[Int])
和一个带有一个可选Toto的Titi类:

case class Titi(c : Option[Toto])
我们创建一个类Titi的实例:

val test = Titi(Some(Toto(Some(1),Some(2))))
现在我想通过假设Titi或b可以等于None来访问Titi变量中Toto的第二个字段,但这是不可能的:

test.c.getOrElse("Something").b.getOrElse(0)

我该怎么做呢?

您的val测试错误,应该是这样的

val test = Titi(Some(Toto(Some(1),Some(2))))
另一件事,在getOrElse中,你必须输入一个有意义的类型

test.c.getOrElse(Toto(None,None))

你的val测试错了,应该是这样

val test = Titi(Some(Toto(Some(1),Some(2))))
另一件事,在getOrElse中,你必须输入一个有意义的类型

test.c.getOrElse(Toto(None,None))

您应该使用flatMap:

test.c.flatMap(_.b).getOrElse(0)
在层次结构中任何位置的情况下,都不会返回0。 如果您有更深层的对象层次结构和属性返回选项,则可以链接flatMap:

Scala还有一种特殊的语法,用于展开嵌套很深的一元类型,需要理解:


您应该使用flatMap:

test.c.flatMap(_.b).getOrElse(0)
在层次结构中任何位置的情况下,都不会返回0。 如果您有更深层的对象层次结构和属性返回选项,则可以链接flatMap:

Scala还有一种特殊的语法,用于展开嵌套很深的一元类型,需要理解:

你可以用fold

test.c.fold(0)(_.b.fold(0)(i => i))
你可以用fold

test.c.fold(0)(_.b.fold(0)(i => i))

您可以通过模式匹配来实现它

val test: Titi = Titi(Some(Toto(Some(1), None)))
val res = test.c match {
case Some(Toto(_, Some(x))) => x
case _ => 0
}
结果:

0

您可以通过模式匹配来实现它

val test: Titi = Titi(Some(Toto(Some(1), None)))
val res = test.c match {
case Some(Toto(_, Some(x))) => x
case _ => 0
}
结果:

0

对不起,我弄错了语法。我指的是一些而不是选项,我现在用这个表达式更正了它。b要得到第二个参数,我想得到b的值,当c等于SometiSome1,例如Some2时,对不起,我弄错了语法。我指的是一些,而不是选项,我现在用这个表达式更正了它,你只需要这样做。b要得到第二个参数,我想得到b的值,当c等于SometiSome1,例如Some2时,我不能也用getOrElse来表示c吗?在我的例子中,c可以是无,当它是一些。。。我需要得到的价值b@Gatsby我编辑了我的答案。如果层次结构中的任何位置都没有flatMap短路,则该解决方案将使用flatMap短路。若你们需要区分哪个选项是None,那个么就用match或者Pedro提出的解决方案。我不能用getOrElse来表示c吗?在我的例子中,c可以是无,当它是一些。。。我需要得到的价值b@Gatsby我编辑了我的答案。如果层次结构中的任何位置都没有flatMap短路,则该解决方案将使用flatMap短路。如果您需要区分哪个选项是无,那么使用match或Pedro提出的解决方案。getOrElse有什么问题?getOrElse有什么问题?