我的问题显示在以下代码段中。
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?
答案 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)