Pipeline in scala——给scala添加管道操作

Posted 蒋航的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Pipeline in scala——给scala添加管道操作相关的知识,希望对你有一定的参考价值。

?linux系统中管道这一功能相信大家肯定使用过,比如现在想找到用户目录下文件名包含db的所有文件,ls ~的结果,作为grep db的参数:

?  ~ ls ~ | grep db
kv.mv.db
kv.trace.db

?elixir(某同名化妆品品牌,怡丽丝尔)语言中也存在类似管道的语法特性(iex是elixir的repl):

iex(1)> "sad" |> String.length |> IO.puts
3
:ok
iex(2)>

?其中"sad" |> String.length |> IO.puts,这句话就是得到某字符串的长度,然后在把它输出,IO.puts的返回值为:ok原子。
?以上代码省略了lambda匿名函数的参数,比如fn(str)->String.length(str) end被简略写成了String.length。以上代码可以写成:

"sad" |> fn(str)->String.length(str) end.() |> fn(n)->IO.puts(n) end.()

?|>管道操作那么酷,想给scala也写一个。
?最初的想法是写一个trait Pipe[+I,-O],类似于List的实现,最终编码类似于1::2::3::NIl。还存在更简单的方法,利用隐式转换即可:

package nathan
package object pipe {
  implicit class PipeOps[I](i: I) {
    def |>[O](f: I => O):O = f(i)
  }
}

?一个管道操作具有两个部分,前者输出以及后者输入,前者为某个值,后者为某个函数,值传入函数,得到其他类型的返回值。

(1 to 10) |>
  (_.toList) |>
  (list => list.contains(3)) |>
  (_ == false) |>
  println

println((1 to 10).toList.contains(3) == false)

?有了管道功能,可以把多层函数嵌套逻辑,用线性结构简洁地描述。

以上是关于Pipeline in scala——给scala添加管道操作的主要内容,如果未能解决你的问题,请参考以下文章

Beginning Scala study note Functional Programming in Scala

编译 Play 框架测试时出现错误“scala.reflect.internal.MissingRequirementError: object scala.runtime in compiler m

使用“Prolog in Scala”查找可用的类型类实例

idea中使用scala运行spark出现Exception in thread "main" java.lang.NoClassDefFoundError: scala/coll

Scala: Practice in Real Project

knn in scala