检查Scala中各种Option对象的好方法

时间:2015-12-03 00:09:04

标签: scala

我的问题显示在以下代码段中。

def myMethod() : Option[Boo] = {
  val f1 = ... // data type: Option[Foo1]
  val f2 = ... // data type: Option[Foo2] 
  val f3 = ... // data type: Option[Foo3]

  // return None if any of the above is None. otherwise return an object Boo
  if(f1.isEmpty || f2.isEmpty || f3.isEmpty)
     return None
  return Boo(f1.get.attr01, f2.get.attr01, f3.get.attr01)
}

哪种更好的方法可以利用Option?

2 个答案:

答案 0 :(得分:4)

假设您的课程类似于以下内容:

case class Foo1(data: Int)
case class Foo2(data: String)
case class Foo3(data: Double)

case class Boo(d1: Int, d2: String, d3: Double)

那么你可以通过理解来实现你的目标:

for {
  d1 <- f1
  d2 <- f2
  d3 <- f3
} yield Boo(d1.data, d2.data, d3.data)

或:

for {
  d1 <- f1.map(_.data)
  d2 <- f2.map(_.data)
  d3 <- f3.map(_.data)
} yield Boo(d1, d2, d3)

答案 1 :(得分:0)

这正是理解所做的事情

def myMethod() : Option[Boo] = for {
  f1 <- ... // data type: Option[Foo1]
  f2 <- ... // data type: Option[Foo2] 
  f3 <- ... // data type: Option[Foo3]
} yield Boo(f1.attr01, f2.attr01, f3.attr01)