如何简洁实现Scala Option类型的反转操作?
简洁实现Option翻转逻辑的方法
嘿,你这个需求其实用Scala标准库中Option自带的fold方法就能完美解决,比你提到的isDefined判断或者模式匹配写法都要简洁!
fold方法正是专门用来处理Option的两种分支情况的:它接受两个参数,第一个参数是当Option为None时要执行的逻辑,第二个参数是当Option为Some时要执行的逻辑。刚好契合你要的“None返回Some(makeB()),Some返回None”的需求。
具体实现代码如下:
def foo(a: Option[A]): Option[B] = a.fold(Some(makeB()))(_ => None)
对比你原来的模式匹配写法,这个一行代码就搞定了,而且语义非常清晰——一眼就能看出来None分支和Some分支分别做什么,不需要额外的match语法块。
另外,也可以用map结合getOrElse来实现,但写法上不如fold直接:
def foo(a: Option[A]): Option[B] = a.map(_ => None).getOrElse(Some(makeB()))
不过显然fold的写法更紧凑,也更符合这个场景的语义。
内容的提问来源于stack exchange,提问作者Emil Lundberg
相关产品推荐
相关产品推荐

