函数式编程及Lamda

函数式编程

定义

函数式编程(funcational programming)属于结构化编程的一种。主要思想是把运算过程尽量写成一系列嵌套的函数调用。

结构化编程
一种编程范型,采用子程序、代码区块、for循环以及while循环 等结构来取代传统的goto

函数式编程关心数据的映射,命令式编程关心解决问题的步骤。

特点
  1. 函数是“第一等公民”
    函数和其他数据类型一样,可以赋值给其他变量,作为其他函数的传入参数或返回值。

  2. 只用“表达式”,不用“语句”
    “expression” 是一个单纯的运算过程,总是有返回值。“statement”是执行某种操作,没有返回值。

  3. 没有“副作用”
    “副作用”是指函数内部有与外部的互动,产生运算以外的其他结果。函数要保持独立,所有功能返回一个新的值,尤其不得修改外部变量的值。

纯函数是这样一种函数,即相同的输入,永远会得到相同的输出,而且没有任何可观察的副作用。

  1. 不修改状态
    函数式编程使用参数保存状态,只返回新的值,不修改系统变量。

  2. 引用透明(Referential transparency)
    函数的运行不依赖外部变量或“状态”,只依赖输入参数。只要参数相同,引用函数返回值总是相同的。

构成
  • 高阶函数(higher-order function)
    能够接受一个函数作为参数的函数。

  • 函子(Functor)
    函子是函数式编程里最重要的数据类型,也是基本的运算单位和功能单位。
    函子是指具有map方法的容器,包含了值和变形关系。map方法将容器里面的每一个值,映射到另一个容器。即将一个范畴转换成令一个范畴。

构成范畴这种数据模型的要素:
所有成员是一个集合
变形关系是函数

  • 闭包(Closure)
    闭包就是能够读取其他函数内部变量的函数,可简单理解成"定义在一个函数内部的函数"。当内嵌函数体内引用到体外的变量时,将会把定义时涉及到的引用环境和函数体打包成一个整体(闭包)返回。
    类是有行为的数据,闭包是有数据的行为。
    闭包是由函数及其相关的引用环境组合而成的实体,即闭包=函数+引用环境
参考

函数式编程入门教程
函数式编程初探
学习Javascript闭包(Closure)

lambda

lambda表达式通常在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数。参考

Lambda表达式的本质只是一个"语法糖",由编译器推断并帮你转换包装为常规的代码,因此你可以使用更少的代码来实现同样的功能。

JAVA中的lambda

Java8之前,传递行为的唯一方法就是通过匿名内部类。Java中的lamda不是一个匿名内部类的语法糖。在匿名类中,this指代的是匿名类本身;而在lambda表达式中,this指代的是lambda表达式所在的这个类。

1.lambda表达式
只有那些仅仅包含一个非实例化抽象方法的接口才能使用lambda表达式。Runnable接口就是函数式接口的一个例子。

@FunctionalInterface
public interface Runnable {
    public abstract void run();
}

Java8默认带有许多可以直接在代码中使用的函数式接口,它们位于java.util.function包中。

2.lambda表达式结构
-> 是用来把参数从函数体中分离出来的操作符。
在lambda表达式中,我们不需要明确指出参数类型,javac编译器会通过上下文自动推断参数的类型信息。根据上下文推断类型的行为称为类型推断

3.方法引用
当需要为一个特定方法创建lambda表达式,比如Function<String, Integer> strToLength = String::length;,可以用缩写符号表示。String是目标引用,::是定界符,length是目标引用的方法。该方法可以是静态或者实例方法。
参考原文

4.实现机制
采用在Java7中新增的动态启用来延迟在运行时的加载策略。当javac编译代码时,捕获代码中的lambda表达式并生成一个动态启用的调用地址(称lambda工厂)。当动态启用被调用时,就会向lambda表达式发生转换的地方返回一个函数式接口的实例。

JAVA中的Stream

Stream是Java 8 提供的高效操作集合类(Collection)数据的API。Stream使用一种类似用SQL语句从数据库查询数据的直观方式来提供一种对JAVA集合运算和表达的高阶抽象。

  1. Collection对比
    Java8运行开发者使用stream方法基于Collection集合创建一个Stream管道。Stream采用内部迭代。
    CollectionStream处理集合方式的不同:

    Collection与Stream处理集合方式的不同

  2. 懒加载
    Stream不会储存数据,懒加载(只有在被使用到时才会执行计算)。Stream表达式在被末端操作方法调用之前不会被赋值计算。

  • 过渡操作:从已存在的stream上产生另一个新的stream的函数,比如filter,map,sorted
  • 末端操作:从stream上产生一个非stream结果的函数,比如collect(toList()),forEach,count,get

参考原文

感想

在一棵树上吊死是大多数非理性死忠的表现。

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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,637评论 18 139
  • 原文链接:https://github.com/EasyKotlin 值就是函数,函数就是值。所有函数都消费函数,...
    JackChen1024阅读 5,957评论 1 17
  • 第一章 为什么要关心Java 8 使用Stream库来选择最佳低级执行机制可以避免使用Synchronized(同...
    谢随安阅读 1,487评论 0 4
  • Java8 in action 没有共享的可变数据,将方法和函数即代码传递给其他方法的能力就是我们平常所说的函数式...
    铁牛很铁阅读 1,223评论 1 2
  • 默默: 今天有些烦躁,原因有很多。可能是生理期快要到了,也可能是因为今天得知数学老师每天要早到,大概7:3...
    掌心的手纹阅读 174评论 0 0