代码之家  ›  专栏  ›  技术社区  ›  Ambareesh B

scala case类选项值链

  •  0
  • Ambareesh B  · 技术社区  · 7 年前
    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 . 参数本身是一个选项值,字段也是选项。如果这两个都是 None (argument或argument.fieldname)我想要 没有 as返回else字段值为some(field value)。有可能吗?

    3 回复  |  直到 7 年前
        1
  •  3
  •   Alexey Romanov    7 年前
    someOperation(me.flatMap(_.secondName))
    

    ScalaDoc

    你可以使用 map 对于非 Option 性能: me.map(_.age) Option[Int] .

        2
  •  2
  •   Dennis Hunziker    7 年前

    如果你 someOperation 返回一个选项,您还可以使用 for 理解力。

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

    这会给你任何你想计算的结果 None

        3
  •  1
  •   Duelist    7 年前

    据我所知,您需要提取person字段并将其传递到方法some操作中。对吗?

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

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