java8入门必备—函数式编程思维——函数式语言向语言和运行时让渡控制权的途径——迭代让位于高阶函数、闭包

构造一层又一层的抽象来处理(并隐藏)琐碎的细节。随着硬件能力的提高,将越来越多的任务转嫁给语言和运行时。

函数式思维的好处之一,是能够将低层次细节(如垃圾收集)的控制权移交给运行时,从而消弭了一大批注定会发生的程序错误。

不管层次高低,抽象的目的总是一样的:让开发者从繁琐的运作细节里解脱出来,去解答问题中非重复性的那些方面。

函数式语言向语言和运行时让渡控制权,让开发者抛开负累,投入到更有意义的问题中去。

函数式语言向语言和运行时让渡控制权的途径——迭代让位于高阶函数

map等函数替换了迭代。如果能够用高阶函数把希望执行的操作表达出来,语言将会把操作安排得更高效,甚至只要增加一行par修饰,就能够让操作并行化。

多线程代码属于最难编写,最容易出错,也最难调试的类别。只有卸下线程管理这份头痛的差事,开发者才能少一些低层次的琐碎操劳。

理解掌握的抽象层次永远要比日常使用的抽象层次更深一层

程序员的工作效率依赖于抽象层。抽象隐藏了繁杂的细节,只是有时候会连同重要的考虑因素一起隐藏掉。

开发者不应该抛开所有的责任,不去理解低层次抽象的来龙去脉。使用抽象必须清楚可能产生的连带后果,理解底层的抽象细节才能写出高性能的代码。
当你掌握了背后的原理,才能把力量用在最正确的地方。

函数式语言向语言和运行时让渡控制权的途径——闭包

闭包(closure)是所有函数式语言都具备的一项平常特性。
闭包,实际上是一种特殊的函数,它在暗地里绑定了函数内部引用的所有变量。这种函数(或方法)把它引用的所有东西都放在一个上下文里“包”了起来。

函数式语言向语言和运行时让渡控制权的途径——闭包——Groovy代码演示闭包的创建和绑定


带有amount参数的paidMore函数,其返回值是一个以Employee实例为参数的代码块,或者叫闭包。类型声明Employee可写可不写,这里写出来顺便起到文档的作用。
给代码块传入参数值100 000,并赋予isHighPaid的名称,于是数值100 000就随着这一步赋值操作,永久地和代码块绑定在一起了。以后有员工数据被代入这个代码块求解的时候,它就可以拿绑定的数值作为标准去评判员工的工资高低。

执行闭包:



闭包在生成的时候,会把引用的变量全部圈到代码块的作用域里,封闭、包围起来(故名闭包)。

闭包的每个实例都保有自己的一份变量取值,包括私有变量也是如此。可以创建paidMore闭包的另一个实例,给它绑定另外的数值(当然实例的名字也要另取)
绑定另一个闭包:

闭包经常被函数式语言和框架当作一种异地执行的机制,用来传递待执行的变换代码,如map()之类的高阶函数。在缺乏闭包特性的旧版Java平台上,Functional Java利用匿名内部类来模仿“真正的”闭包的某些行为,但语言的先天不足导致这种模仿是不彻底的。

函数式语言向语言和运行时让渡控制权的途径——闭包——原理


makeCounter()函数首先定义一个局部变量(local_variable),接着返回一个使用了该局部变量的代码块。
注意makeCounter()函数的返回类型是Closure,而不是一个单纯的值。代码块的工作仅仅是递增并返回其局部变量的值。方法中两次明确写出了return关键字,其实这两个地方Groovy都允许省略。

调用代码块的时候用到了Groovy提供的语法糖衣,即在代码块变量名后直接跟一对圆括号的写法(否则应该写成c1.call())。

虽然局部变量不是在代码块里面定义的,但只要代码块引用了该变量,两者就被绑定在一起,这种联系在代码块实例的全部生命期内都一直保持着。
从实现的角度来说,代码块实例从它被创建的一刻起,就持有其作用域内一切事物的封闭副本。当代码块实例被垃圾收集的时候,它持有的引用也同时被回收。

创建一个闭包仅仅为了修改自身的内部状态,不是值得提倡的闭包用法,更常见的用法是绑定常量或者不可变的值。

函数式语言向语言和运行时让渡控制权的途径——闭包——Java8之前的模拟

Counter类还可以有别的一些写法(比如写成匿名的、泛型的,等等),但不管怎么做,都避免不了要自己去管理状态。闭包在这里表现出来的函数式思维就是“让运行时去管理状态”。比起自己硬着头皮去处理字段创建、呵护状态(包括经受多线程环境的严酷考验)这些繁琐的事务,还不如交出对状态的控制权,让语言和框架悄悄在背后帮我们管理好。

函数式语言向语言和运行时让渡控制权的途径——闭包——抓住上下文,而非状态

让语言去管理状态。

闭包还是推迟执行原则的绝佳样板。把代码绑定到闭包之后,可以推迟到适当的时机再执行闭包。这个特点在很多场合都能发挥作用。例如必要的变量和函数可能并不在定义时的作用域里,要到执行的时候才准备好。那么把执行上下文放在闭包里保留起来,就可以等到正确的时机再完成执行。
命令式语言围绕状态来建立编程模型,参数传递是其典型特征。闭包作为一种对行为的建模手段,让把代码和上下文同时封装在单一结构,也就是闭包本身里面,像传统数据结构一样可以传递到其他位置,然后在恰当的时间和地点完成执行。
抓住上下文,而非状态。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345

推荐阅读更多精彩内容

  • 86.复合 Cases 共享相同代码块的多个switch 分支 分支可以合并, 写在分支后用逗号分开。如果任何模式...
    无沣阅读 1,347评论 1 5
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,600评论 18 139
  • 感谢社区中各位的大力支持,译者再次奉上一点点福利:阿里云产品券,享受所有官网优惠,并抽取幸运大奖:点击这里领取 多...
    HetfieldJoe阅读 1,004评论 0 11
  • 原文链接:https://github.com/EasyKotlin 值就是函数,函数就是值。所有函数都消费函数,...
    JackChen1024阅读 5,950评论 1 17
  • 今晚 我又把明早的饭买好了 但常常 我对第二天的早餐没有食欲 凉了 剩了 忘了 但我总是急着要买好明早的饭。
    倩何人换取阅读 169评论 0 1