Scala新手求助:优化空值与搜索字符串比较的简洁实现
简化Scala中Option[String]与"null"搜索字符串的比较
嘿,作为Scala新手能察觉到重复代码的问题,这真的很赞!频繁写.getOrElse("null")确实有点繁琐,这里有几个简洁优雅的方案帮你解决这个问题:
1. 给Option[String]添加扩展方法(推荐)
如果整个类甚至整个项目都有这种需求,给Option[String]定义一个专属的扩展方法是最省心的——一次定义,到处能用。
Scala 3 写法:
// 可以放在类的伴生对象里,或者单独的工具对象中 extension (opt: Option[String]) def asSearchString: String = opt.getOrElse("null")
Scala 2 写法(用隐式类):
implicit class OptionSearchOps(opt: Option[String]) { def asSearchString: String = opt.getOrElse("null") }
之后你的代码就能改成这样,清爽多了:
def someFunction(someSearchString: String, someSet: Set[SomeType]): Set[Blah] = someSet.collect { case SomeItem(x, y, z) if z.asSearchString == someSearchString => // 后续逻辑 }
2. 封装成工具函数
如果不想用扩展方法,也可以写一个小巧的工具函数,把比较逻辑封装起来:
private def matchesSearchTerm(opt: Option[String], searchTerm: String): Boolean = opt.getOrElse("null") == searchTerm
然后在collect的条件里直接调用:
def someFunction(someSearchString: String, someSet: Set[SomeType]): Set[Blah] = someSet.collect { case SomeItem(x, y, z) if matchesSearchTerm(z, someSearchString) => // 后续逻辑 }
3. 用模式匹配直接覆盖两种情况
如果你想完全避免调用getOrElse,可以在case语句里拆分两种场景(z有值/无值),直接匹配搜索字符串:
def someFunction(someSearchString: String, someSet: Set[SomeType]): Set[Blah] = someSet.collect { // z有值时,直接和搜索字符串比较 case SomeItem(x, y, Some(value)) if value == someSearchString => // 后续逻辑 // z为空时,判断搜索字符串是否是"null" case SomeItem(x, y, None) if someSearchString == "null" => // 后续逻辑(和上面的逻辑可以抽成公共方法避免重复) }
这样做的好处是逻辑更直观,不用依赖getOrElse的默认值,也能清晰区分两种场景。
内容的提问来源于stack exchange,提问作者CustardBun
相关产品推荐
相关产品推荐

