Scala中结合成员函数调用与其他函数调用的惯用方法是什么?
Scala 链式调用自定义函数的优化写法
当我们在Scala中操作对象(比如列表)时,想要把自定义函数和对象的成员函数按顺序组合,常会写出这样的代码:
g(l.map(f) .foldRight(...)) .map(h)
一旦函数序列变长,这种嵌套写法会显得杂乱。有没有更优雅的链式写法?比如像这样直接把自定义函数融入调用链里:
l.map(f) .foldRight(...) .call(g) // call 就是把当前结果传给函数g处理 .map(h)
两种实用的解决方案
- 扩展通用
call方法
给所有类型扩展一个轻量级的call方法,让它接收函数并把当前值传入执行:
implicit class AnyOps[A](val value: A) extends AnyVal { def call[B](f: A => B): B = f(value) }
之后就能直接用你想要的链式写法,示例:
// 假设initialValue是foldRight的初始值,folder是对应的折叠函数 l.map(f) .foldRight(initialValue)(folder) .call(g) .map(h)
这种方式通用性拉满,任何类型都能靠这个方法衔接自定义函数。
- 使用管道操作符
|>
Scala 2.13及以上版本已经内置了管道操作符|>,功能和上面的call完全一致,直接用就行:
l.map(f) .foldRight(initialValue)(folder) .|>(g) .map(h)
如果是Scala 2.13之前的版本,也可以自己定义这个操作符:
implicit class PipeOps[A](val value: A) extends AnyVal { def |>[B](f: A => B): B = f(value) }
管道符的写法更贴合函数式编程的风格,也是社区里比较常用的写法。
内容的提问来源于stack exchange,提问作者Matei
相关产品推荐
相关产品推荐

