Scala案例类选项值链接

时间:2018-06-07 11:13:26

标签: scala scala-collections

case class Person(@BsonProperty("first_name") firstName:Option[String],@BsonProperty("second_name")  secondName:Option[String],@BsonProperty("person_age") var  age:Int)


val me = Some(Person(Some(Ambareesh),Some(B),23))

      Or

val me = None

      Or

val me = Some(Person(Some(Ambareesh),None,23))

     Or

val me = Some(Person(None,None,23))


someOperation(me.secondName / None) //How can I implement this behavior in single line.
someOperation(me.firstName / None)


def someOperation(name:Option[String]){
   //Do ...
 }

我对方法someOperation的参数(Person的实例)表示怀疑。参数本身是Option值,而fields也是Options。如果其中任何一个是None(argument或argument.fieldName),我希望None返回,否则字段值为Some(fieldValue)。有可能吗?

3 个答案:

答案 0 :(得分:3)

someOperation(me.flatMap(_.secondName))

请参阅ScalaDoc

您可以将map用于非Option属性:me.map(_.age)Option[Int]

答案 1 :(得分:2)

如果您的someOperation返回了一个也可以使用for理解的选项。

val result: Option[String] = for {
   person <- me
   firstName <- someOperation(person.firstName)
   secondName<- someOperation(person.secondName)
} yield <use firstName, secondName here>

这将为您提供您想要计算的结果或None

答案 2 :(得分:1)

据我了解,您需要提取人员字段并将其传递给方法someOperation。正确?

如果是这样,您可以使用模式匹配:

someOperation(
  me match {
    case Some(person) => person.firstName
    case None => None
  } 
)