Scala中如何在pipe链式调用里用内置函数替代自定义Option.get封装
解决方案
pipe算子要求接收单参数函数,而Option.get是Option类的成员方法,不能直接传入,只要做简单的语法适配即可直接使用Scala内置实现,无需自定义myOptionGet函数,也不会增加代码冗余,保留链式调用逻辑,有以下几种可行写法:
写法1:匿名占位符(全版本通用,最简洁)
直接用_.get作为参数传给pipe,这是Scala原生语法糖,会自动编译为符合要求的Function1[Option[T], T]类型的匿名函数,没有任何冗余代码:
package playground import scala.util.chaining.scalaUtilChainingOps object TEST123 { def main(args: Array[String]): Unit = { Some("abc") pipe (_.get) pipe println // 输出:abc } }
写法2:复用独立函数(适合多处调用场景)
如果需要在多个地方用到这个逻辑,不想重复写_.get,可以直接定义基于内置方法转换的泛型函数,不需要自己实现获取逻辑:
Scala 3 版本(支持多态函数)
val optionGet: [T] => Option[T] => T = [T] => (o: Option[T]) => o.get // 使用 Some("abc") pipe optionGet pipe println
Scala 2 版本
def optionGet[T]: Option[T] => T = _.get // 使用 Some("abc") pipe optionGet pipe println
注意事项
不要在生产代码中随意使用Option.get,该方法会在Option为None时直接抛出异常,建议优先使用getOrElse、fold等更安全的API,同样可以适配pipe链式调用,示例如下:
// 安全写法示例,None时返回默认值 Option.empty[String] pipe (_.getOrElse("默认值")) pipe println // 输出:默认值
内容的提问来源于stack exchange,提问作者Hartmut Pfarr
相关产品推荐
相关产品推荐

