2015-12-03 53 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