Scala 获取可选类字段的值
假设我有一个Toto类,它有两个可选字段: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
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有什么问题?