编程中的链式调用与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. json传参 js前端和java后端 的简单例子

    下面讲解了从前端js对象-->json字符串-->java字符串---->java map的过程 1,初始化js对象 var param = {}; param.krel = kre ...

  2. Java通过POI读取Excel

    package com.hd.all.test.testjava; import java.io.File; import java.io.FileInputStream; import java.i ...

  3. NeuroNER+brat工具学习

    1.Brat:http://brat.nlplab.org/ 能够进行直觉标注.命名实体识别.关系标注.分块.共存标注.二元关系标注等(药物与药物).时间标注. 但是这个安装好麻烦啊... 2.

  4. 收藏住:金融&电商类原型模板重磅来袭,免费使用!

    经常有很多产品经理和设计师想要各行业的产品原型模板,可以直接下载使用.现在分享下一个资源渠道:墨刀的原型模板. 上新了金融类和电商类的主要App设计原型,可以直接免费使用,具体包括: 金融类 招商银行 ...

  5. R语言的scale函数

    1.数据的中心化 所谓数据的中心化是指数据集中的各项数据减去数据集的均值. 例如有数据集1, 2, 3, 6, 3,其均值为3 那么中心化之后的数据集为1-3,2-3,3-3,6-3,3-3,即:-2 ...

  6. 配置完centos 6以后,大概需要安装的软件(主要是yum)

    根据实践,把我的经验说一下,以后我自己也可以按照这个快速安装软件. 1. 配置源.百度网盘的tools/download/linux已经放了几个挺重要的 东西了. yum -y install epe ...

  7. Go win32

    先说的让人兴奋的吧,“GO的库开发在windwos上尽然是一摸一样的啊” C:\go-pro\go-self-package>go build gin-main.go 2017/09/20 14 ...

  8. ASP.Net Core 2.2 MVC入门到基本使用系列 (四)(转)

    本教程会对基本的.Net Core 进行一个大概的且不会太深入的讲解, 在您看完本系列之后, 能基本甚至熟练的使用.Net Core进行Web开发, 感受到.Net Core的魅力. 本教程知识点大体 ...

  9. sqlmap常用技巧整理

    言 通过在乌云网上出现的很多SQL注入漏洞,因此来总结一下,大致使用SQLMAP所遇到的参数. 基本结构 基本SQLMAP的使用方式就如下所示,使用参数式的方式,按需求添加. 12 sqlmap.py ...

  10. can not create symbolic link HDFS解压自动配置lib报错。

    如题,使用FusionInsight解压生成样例代码的时候报错,找不到解释.只猜测是权限问题.然后并没有仔细静心思考,心里杂念很多,很浮躁. 解决方法是“以管理员身份运行“. 想想高中:面对问题,不能 ...