2015-12-03 56 views
0

我的问题显示在下面的代码段。一个很好的方法来检查斯卡拉的各种选项对象

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的更好的方法?

回答

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) 
+0

感谢您的建议。在我的情况下,这些数据的值来自数据库和Boo使用它们的属性创建的对象。 – TeeKai

+2

@TeeKai你应该能够适应我给出的符合你情况的具体情况。 – Shadowlands

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) 
+0

感谢您告诉我这个术语,以便我可以跟进并了解有关Scala的更多信息。 – TeeKai