摘要:本文是函数式编程第二章的读书笔记。的语法简化了使用匿名内部类时的模板代码,让程序员专注于编写想要执行的行为,也让代码更加简洁易读。中最重要的函数接口类型推断为新成员表达式提供了类型推断的支持,在不需要声明参数类型的表达式中表现的有为明显。
本文是「Java 8 函数式编程」第二章的读书笔记。
Lambda引入的变化Lambda表达式,是一种紧凑的、传递行为的方式,从编程思想上来讲,就是代码即数据。
过去的Java中,存在大量的匿名内部类的使用,会新建一个匿名内部类传入调用的方法中。这种传统的方式,会造成冗余的、不易阅读的代码。
于是Lambda诞生了。Lambda的语法简化了使用匿名内部类时的模板代码,让程序员专注于编写想要执行的行为,也让代码更加简洁易读。
Lambda表达式的形式Runnable runable = () -> System.out.println("Hello Lambda");//1 runable = () -> { System.out.print("Hello"); System.out.println(" Lambda"); };//2 ActionListener listener = event -> System.out.println("get event");//3 BinaryOperatoradd = (x, y) -> x + y;//4 BinaryOperator minux = (Long x, Long y) -> x - y;//5
常见的Lambda表达式有以上5种,每个Lambda表达式都可以分为三个部分:
参数部分:() event (x, y) (Long x, Long y)
将参数和表达式主体分开的符号:->
表达式主体
参数的形式Lambda表达式可以看作是匿名内部类的简写形式,参数也就是使用匿名内部类时实现的方法的参数。
有的方法不需要参数,如Runnable的run方法,所以使用()代表参数部分。
有的方法只需要一个参数且类型确定,如ActionListener.actionPerformed方法,可以直接使用参数,不需要指定类型,也不需要加括号。
有多个参数时,必须要加上括号,把参数扩起来
当声明参数类型时,无论有多少个参数,都需要加括号
表达式主体的形式表达式可以只有一行代码,也可以有多行代码;有的表达式有返回值,有的没有。
只有一行代码的表达式不需要{}
如果有返回值,不用写return,表达式会把这行代码的返回值作为返回值
如果使用了{},则需要显式的写出return
有多行代码的表达式必须使用{}
如果有返回值,需要显式的写return
引用值,而不是变量匿名内部类中,如果想要引用其所在方法中的变量,需要将其声明为final。这意味着你实际引用的是一个值,而不是变量。
在Java 8 中,虽然可以引用非final的变量,但这个变量必须是既成事实上的final,如果对变量进行修改,将无法通过编译。这意味着Lambda表达式仍然是引用的一个值,而不是变量。
实际上可以通过使用数组来绕开编译器,但是这样做之前应该考虑一下你的代码逻辑是否正确。
函数接口只有一个抽象方法的接口叫做函数接口。
JDK中最重要的函数接口:
Interface | Argument | Return | e.g. |
---|---|---|---|
Predicate |
T | boolean | fliter |
Consumer |
T | void | forEach |
Function |
T | R | map |
Supplier |
None | T | factory function |
UnaryOperator |
T | T | modify String |
BinaryOperator |
(T, T) | T | add two instances |
Java 8为新成员Lambda表达式提供了类型推断的支持,在不需要声明参数类型的Lambda表达式中表现的有为明显。形如:
BinaryOperatoradd = (x, y) -> x + y;
的表达式得以通过编译并正确执行,就是因为JVM通过泛型参数Integer推断出了方法参数的类型。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/66579.html
摘要:本书第四章的读书笔记本章主要阐述如何使用表达式基本类型考虑到装箱类型过于占用内存提供了针对基本类型的操作以达到优化的效果如方法对基本类型做特殊处理的方法在命名上有明确规范如果返回类型为基本类型则在基本类型名称前面加如果参数类型是基本类型则不 本书第四章的读书笔记, 本章主要阐述: 如何使用Lambda表达式. 基本类型 考虑到装箱类型过于占用内存, JDK提供了针对基本类型的操作, 以...
摘要:限制编写并行流,存在一些与非并行流不一样的约定。底层框架并行流在底层沿用的框架,递归式的分解问题,然后每段并行执行,最终由合并结果,返回最后的值。 本书第六章的读书笔记,也是我这个系列的最后一篇读书笔记。后面7、8、9章分别讲的测试、调试与重构、设计和架构的原则以及使用Lambda表达式编写并发程序,因为笔记不好整理,就不写了,感兴趣的同学自己买书来看吧。 并行化流操作 关于并行与并发...
摘要:但是,最好使用差异化的类型定义,函数签名如下其实二者说的是同一件事。后者的返回值和初始函数的返回值相同,即。破坏式更新和函数式更新的比较三的延迟计算的设计者们在将引入时采取了比较特殊的方式。四匹配模式语言中暂时并未提供这一特性,略。 一、无处不在的函数 一等函数:能够像普通变量一样使用的函数称为一等函数(first-class function)通过::操作符,你可以创建一个方法引用,...
摘要:本文是函数式编程第三章的读书笔记,章名为流。正确使用表达式明确要达成什么转化,而不是说明如何转化没有副作用只通过函数的返回值就能充分理解函数的全部作用函数不会修改程序或外界的状态获取值而不是变量避免使用数组逃过的追杀,应该考虑优化逻辑 本文是「Java 8 函数式编程」第三章的读书笔记,章名为流。本章主要介绍了外部迭代与内部迭代以及常用的高阶函数。 外部迭代与内部迭代 外部迭代 过去我...
摘要:利用前面所述的方法,这个例子可以用方法引用改写成下面的样子构造函数引用对于一个现有构造函数,你可以利用它的名称和关键字来创建它的一个引用。 第三章 Lambda表达式 函数式接口 函数式接口就是只定义一个抽象方法的接口,哪怕有很多默认方法,只要接口只定义了一个抽象方法,它就仍然是一个函数式接口。 常用函数式接口 showImg(https://segmentfault.com/img...
阅读 2320·2021-11-24 10:18
阅读 3384·2021-09-22 15:35
阅读 3339·2021-09-13 10:37
阅读 3766·2021-09-06 15:14
阅读 2070·2021-09-06 15:02
阅读 2211·2021-09-02 15:11
阅读 546·2019-08-30 15:53
阅读 3074·2019-08-29 16:15