zoukankan      html  css  js  c++  java
  • 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)
    

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

    知难行易
    原创博文,请勿转载
    我的又一个博客hangscer.win
  • 相关阅读:
    不容易系列之(3)—— LELE的RPG难题(递推)
    亲和数(因子和)
    爬虫正式学习day2
    爬虫小练习:堆糖图片抓取--爬虫正式学习day1
    js笔记--高阶函数array的各种函数
    js笔记--高阶函数sort()
    js笔记--高阶函数filter()
    js笔记--高阶函数map() reduce()
    js笔记--方法
    js笔记--变量部分
  • 原文地址:https://www.cnblogs.com/hangscer/p/8158124.html
Copyright © 2011-2022 走看看