Scala中移除if-else语句,函数式重构代码及模式匹配指导
解决方案
当然可以用Scala的模式匹配实现,而且还有更简洁的函数式写法来替代这段if-else代码:
1. 模式匹配实现
直接对Option[Foo]做模式匹配,安全处理Some和None两种情况:
case class Foo(val bar: String) val foo: Option[Foo] = Some(Foo("mark")) val bar = foo match { case Some(f) => Some(f.bar) case None => None }
这段代码会匹配foo的两种状态:如果是Some(Foo),就提取内部的f并返回Some(f.bar);如果是None,直接返回None,完全替代了原有的if-else逻辑。
2. 更简洁的函数式写法(推荐)
其实Scala的Option类型本身提供了map方法,这种场景下用map比模式匹配更优雅,代码更短:
val bar = foo.map(_.bar)
Option的map方法会自动处理两种情况:
- 当
foo是Some(Foo)时,对内部的Foo实例执行_.bar,返回包装了bar值的Some - 当
foo是None时,直接返回None
另外提醒一下:原代码里用isDefined+get的写法并不推荐,因为如果foo是None时调用get会抛出NullPointerException,而模式匹配或者map都是安全的操作,不会出现这种风险。
内容的提问来源于stack exchange,提问作者Naveenkumar
相关产品推荐
相关产品推荐

