编程中的链式调用与Linux Shell 中的管道类似。Linux Shell 中的管道 ,会将管道连接的上一个程序的结果, 传递给管道连接的下一个程序作为参数进行处理,依次串联起N个实用程序形成流水线处理。流水线处理技术显得比较优雅可读。比如使用 Supervisor 管理后台任务时, 要重启所有任务, 可以使用

sudo supervisorctl status | grep "RUNNING" | cut -f 1 -d' ' | grep '\-8' | awk '{print "sudo supervisorctl restart " $0"\nsleep 2 " }' > /tmp/restart.sh && sh /tmp/restart.sh

sudo supervisorctl status 打印所有supervisor管理的后台任务及状态, 并传给 grep ;grep 筛选出文本中含有 RUNNING 的内容传给 cut ;cut 程序根据空格对内容切分字段,只保留第一个字段的值,然后传给 grep; grep 同样筛选出内容只含有 -8 的任务内容, 传给 awk ; 最后 awk 根据传入的内容组装新的内容行, 重定向写入文件 /tmp/restart.sh 中; 如果以上流水线处理成功, 那么就会执行 sh /tmp/restart.sh。

编程中的链式调用类似: 上一个对象 A 的方法调用 a 的结果对象 B,接着调用 B 的方法 b 得到 C, 接着调用 C 的方法 c 得到 D, 像成语接龙一样;对于列表元素的批量处理尤其适合。 而对于对象来说,为了制造链式调用,则需要返回相同父类型的对象, 或者规划好一系列可以连续调用的对象。

以下是一个Scala程序示例, 通过 3x+1 谜题演示链式调用。 P3xPlus1Number 含有个方法 do3xplus1,做一次迭代后返回自身,从而可以连续调用 do3xplus1。

package scalastudy.basic

/**
* Created by shuqin on 17/3/19.
*
* 3x+1 谜题, 演示链式调用
*/
object Puzzle3xPlus1 extends App { println(P3xPlus1Number(78).do3xplus1().do3xplus1().do3xplus1())
println(P3xPlus1Number(78).solve())
1 to 1000 map { P3xPlus1Number(_).solve() } map { t => (t._1, t._2) } foreach { println }
} class P3xPlus1Number(init:Int) { var innerNumber = init def do3xplus1(): P3xPlus1Number = {
innerNumber = if (innerNumber%2==1) { innerNumber*3+1 } else { innerNumber/2 }
this
} def solve(): (Int, Int, List[Int]) = {
var sol = (init, 0, List[Int]())
while (innerNumber != 1) {
sol = (init, sol._2 + 1, innerNumber::sol._3)
do3xplus1()
}
(init, sol._2 + 1, (innerNumber::sol._3).reverse)
} override def toString():String = {
"P3xPlus1Number["+innerNumber+"]"
}
} object P3xPlus1Number {
def apply(init:Int): P3xPlus1Number = {
new P3xPlus1Number(init)
}
}

而以下代码则典型地呈现了列表的链式调用。

1 to 1000 map { new P3xPlus1Number(_).solve() } map { t => (t._1, t._2) } foreach { println }

链式调用并不一定会提升性能, 主要是代码实现的美观性和可读性。

注意到,这里 object P3xPlus1Number 是类 P3xPlus1Number 的伴生对象,主要用于构造 P3xPlus1Number 对象以及放置相关的静态工具方法。 这也是 Scala 的一个小小的设计理念差异之处: 将实例方法与类方法分离开。定义 apply 方法使得客户端不用 new 关键字就可以构造 P3xPlus1Number 对象。

编程中的链式调用:Scala示例的更多相关文章

  1. JavaScript中的链式调用

    链模式 链模式是一种链式调用的方式,准确来说不属于通常定义的设计模式范畴,但链式调用是一种非常有用的代码构建技巧. 描述 链式调用在JavaScript语言中很常见,如jQuery.Promise等, ...

  2. java中的链式编程

    听到链式编程听陌生的,但是写出来就感觉其实很熟悉 package test; public class Test { String name; String phone; String mail; S ...

  3. 关于JavaScript中的setTimeout()链式调用和setInterval()探索

    http://www.cnblogs.com/Wenwang/archive/2012/01/06/2314283.html http://www.cnblogs.com/yangjunhua/arc ...

  4. (原创)c++11中 function/lamda的链式调用

    关于链式调用,比较典型的例子是c#中的linq,不过c#中的linq还只是一些特定函数的链式调用.c++中的链式调用更少见因为实现起来比较复杂.c++11支持了lamda和function,在一些延迟 ...

  5. Java 中的链式编程

    前言 ​ 在写项目的时候,有一个实体类有好多个属性,new 出来之后需要不停的使用setXXX( )方法,效率低而且代码可读性差,查询了下发现可以实现实体类的链式编程. public class Us ...

  6. 【Java】子类的链式调用

    记录最近在项目设计中遇到的一个小问题. 前提:有这样两个POJO类,它们都可以通过链式调用的方式来设置其属性值,其中一个类继承了另一个类. 问题:通过链式调用,子类对象访问父类方法后,如何使返回对象仍 ...

  7. Swift-09-可空链式调用(Optional Chaining)

    我对这个的理解就是:我们有可能会用到其他的属性或者方法,当我们在使用其他的时候,可以使用点语法去访问另一个的属性,这样的使用,就形成了链式访问. 可空链式调用是一种可以请求和调用属性.方法及下表的过程 ...

  8. 疯狂的类构造器Builder模式,链式调用

    疯狂的类构造器 最近栈长在做 Code Review 时,发现一段创建对象的方法: Task task = new Task(112, "紧急任务", "处理一下这个任务 ...

  9. 如何写 JS 的链式调用 ---》JS 设计模式《----方法的链式调用

    1.以$ 函数为例.通常返回一个HTML元素或一个元素集合. 代码如下: function $(){ var elements = []; ;i<arguments.length;i++){ v ...

随机推荐

  1. 洛谷P3960 列队 NOIp2017 线段树/树状数组/splay

    正解:动态开点线段树 解题报告: 传送门! 因为最近学主席树的时候顺便get到了动态开点线段树?刚好想起来很久很久以前就想做结果一直麻油做的这题,,,所以就做下好了QAQ 然后说下,这题有很多种方法, ...

  2. WPF 参数在Page见传递

    void goButton_Click(object sender, RoutedEventArgs e) { this.NavigationService.Navigate(new ContentP ...

  3. windows版本下ELK配置

    windows版本的es和kibana相对配置起来很简单,网上已经有很多例子都是正确的,只需按照步骤安装一下即可. 主要logstash,网上说的方案,大都不能配置成功,或者总有一些错误,下面把我自己 ...

  4. ABP-添加表

    1.在My_ABP.Core根目录下先创建一个文件夹,在该文件夹里创建一个公共的类,在里面定义所需要用到的属性 public class Person:Entity      {         pu ...

  5. eslint 代码规范

    官网:https://github.com/standard/standard/blob/master/docs/RULES-zhcn.md JavaScript Standard Style Eng ...

  6. centos7部署fabric-ca错误解决

    1.fabric-ca 编译错误:ltdl.h: no such file 在fabric-ca目录中使用make编译时,会出现如下错误: 解决方案: 如果在ubunt操作系统中,只需安装:apt i ...

  7. 以太坊abi

    什么是abi ABI是Application Binary Interface的缩写,字面意思 应用二进制接口,可以通俗的理解为合约的接口说明.当合约被编译后,那么它的abi也就确定了. 我们来看看一 ...

  8. 【Python】-NO.99.Note.4.Python -【Python3 条件语句 循环语句】

    1.0.0 Summary Tittle:[Python]-NO.99.Note.4.Python -[Python3 条件语句 循环语句] Style:Python Series:Python Si ...

  9. pandas.query()

    1. 查询 已知data: 查询概率等于0.4的所有行 问题所在:query后面只支持string形式的值,而"probability"==0.4返回的是一个bool类型,结果不是 ...

  10. android SDK打包app

    SDK  软件开发工具包(Software Development Kit) JDK  开发工具包(Java Developer's Kit) 1.搜索java jdk 进入官网 http://www ...