目录
2.语法格式 (抽象方法的参数列表) -> {实现方法的方法体}
5.变量作用域
6.四大内置核心函数式接口
7.方法引用(调用方法)
首先让我们来了解一下jdk8的新特性
jdk8新特性
- Lambda和Stream流
- hashmap数组、链表、红黑树
- JVM元空间代替了永久代
一、Lambda表达式
1.函数式接口:
有且仅有一个抽象方法的接口。
在java中函数式接口最主要的体现就是Lambda表达式,只有确保接口中有且仅有一个抽象方法,java中的Lambda才能顺利的进行推导。
@Functionallnterface 可以放在接口上面,定义一个函数式接口。如果不是函数接口会报红
语法糖:是指使用更加方便,但是原理不变的代码语法。从应用层面讲,Java中的Lambda可以被当作是匿名内部类的语法糖,但是二者在原理上是不同的。
匿名内部类:实现了接口或继承父类;
没有名字:(所以在声明匿名内部类的同时,可以指定一个类名, 这个类名只是用于方便调用和查看代码,并不影响实际运行);
类的主题:成员变量、方法、代码块。
内部类:在类里边再定义一个类,不能带public(但凡带public的类,类名必 须和文件名一样。)
2.语法格式 (抽象方法的参数列表) -> {实现方法的方法体}
例:(o1,o2) -> Integer.compare(o1,o2);
(1) ->是Lambda操作符或箭头操作符
(2) ->左边是Lambda形参列表(其实就是接口中的抽象方法的参数列表)
(3) ->右边是lambda体(Lambda 表达式要执行的功能/重写的接口的方法)
3.Lambda表达式接口6种写法:
无参无返回值、一个参数无返回值、多个参数无返 回值、无参有返回值、一个参数有返回值、多个参数有返回值。
4.简化Lambda表达式
可选类型的声明:不需要声明参数类型。
可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要。
可选的大括号:如果主体包含了一个语句 ,就不需要使用大括号。
可选的返回关键字:如果主体只有一个表达式返回值,则编译器会自动返回值。大括号需要指定表达式返回了一个数值。
5.变量作用域
访问局部变量要注意3点:
(1)可以直接在Lambda表达式 中访问外层的局部变量;
(2)在Lambda表达式当中被引用的变量的值不可以被更改;(本质上因为lambda 用的是 内部类)
(3)在Lambda表达式当中不允许声明一个与局部变量同名的参数(包括参数名称 也不能 一样)
6.四大内置核心函数式接口
(必须熟悉的知道名字、方法名、参数列表、返回值,包 括工具类中常用的静态方法)
内置接口:Consumer<T>、Supplier<T>、Function<T R>、Predicate<T>
7.方法引用(调用方法)
双冒号::为引用运算符,而它所在的表达式被称为方法引用。
(1)构造方法引用
格式:类名 :: new
注意:调用构造方法时,函数式接口的方法参数和构造方法的参数一致,可以是一个参 数,也可以是多个参数
符合:(方法参数)-> new 对象(构造参数)就可以使用对象 :: new,如果是 有参构 造,参数由方法参数决定
(2)静态方法引用
格式:类名 :: 静态方法名
注意:接口中的方法调用了另一个类的静态方法。要求两个方法的参数一致
(3)实例方法引用
格式:类名 :: 方法名
注意:接口的方法调用了对象的方法,要求两个方法的参数一致。
(4)对象方法引用
格式:类名 :: 方法名
条件:在抽象方法中,参数作为实例方法调用者,可以直接用参数的类去调用 方法。