day012-Lambda、方法引用
1、 函数式接口
有且只有一个抽象方法的接口就是函数式接口。
函数式接口的定义格式:
Interface 接口名{
抽象方法;
}
@Override:用来修饰方法声明,告诉编译器该方法是重写父类的方法,如果父类没有该方法,则编译失败。
@FunctionalInterface 使用该注解来定义接口,
JDK 1.8新特性
用来修饰接口。告诉编译器该接口是一个函数式接口,如果接口不是函数式接口,就会编译失败。
Lambda表达式的特点:
延时执行。在需要的时候,再执行。
例子:记录日志、用户的访问日志、系统日志。
函数式接口使用场景:
(a) 如果方法参数是函数式接口的类型,则可以出传递Lambda表达式
(b) 如果方法返回值类型时函数式接口类型,则可以返回Lambda表达式
2、方法引用
通过类名或对象名引用已经存在的方法来简化Lambda表达式。通过一个方法名字来引用已经存在的方法,可以减少重复代码的编写。方法引用是一个更加紧凑、易读的Lambda表达式。其中方法引用的操作符是双冒号”::”。
2.1 方法引用的格式
通过类名或对象名引用
类名::方法名 或 对象名::方法名
2.2方法引用的四种类型
(a) 静态方法引用:通过类名引用
(b) 对象方法引用:通过对象名应用
(c) 特定类型的实例方法引用
(d) 构造方法的引用
2.3静态方法引用
通过类名引用已经存在的静态方法,格式:类名::静态方法
2.3.1静态方法引用内部实现步骤
(a) 创建了一个类实现了函数式接口,重写接口中的抽象方法;在重写的方法中调用了被引用的方法
(b) 创建实现类对象
2.3.2静态方法引用注意事项
被引用的方法和函数接口中的抽象方法必须有相同参数列表。
如果函数式接口中的抽象方法有返回值,则被引用的方法也必须有返回值。如果函数式接口中的抽象方法没有返回值,则被引用的方法可以有返回值,也可以没有返回值。
2.4对象方法引用
通过类名引用已经存在的成员方法,对象名::成员方法
2.5构造方法引用
构造方法本质上是静态方法。构造方法引用格式:类名::new
比如:Student::new
2.6特定类型的方法引用
语法格式:类名::实例方法名
类名::实例方法名这种方法引用的特殊之处:当使用类名::实例方法名方法引用是,一定是Lambda表达式所接收的第一个参数来调用实际方法,如果Lambda表达式接收多个参数,其余的参数作为方法的参数传递进去。
特定类型的实例方法引用注意事项:
被引用的方法和函数式接口中的方法要相差一个参数,被引用的调用者是Lambda表达式中的第一个参数调用,其余参数作为被引用的参数传递。
2.7 通过this引用成员方法
this代表当前对象,如果需要引用的方法就是当前类中的成员方法,那么就可以使用“this::成员方法”的格式来使用方法引用
2.8 通过super引用成员方法
如果存在继承关系,当Lambda中需要出现super调用时,也可以使用方法引用来替代。格式是: super::成员方法。
2.9 数组构造器引用
3、常用函数式接口
JDK提供了大量常用的函数式接口以及丰富Lambda的典型使用场景,它们主要在java.util.function包中提供。
3.1 Supplier接口
java.util.function.Supplier<T>接口仅包含一个无参的方法: T get()。用来获取一个泛型参数指定类型的对象数据。由于这是一个函数式接口,这也就意味着对应的Lambda表达式需要“对外提供”一个符合泛型类型的对象。
3.2 Consumer接口
java.util.function.Consumer<T>接口跟Supplier接口刚好相反,它不是生产一个数据,而是消费一个数据,其它数据类型由泛型参数决定。
抽象方法:
(a) void accept(T t) 消费一个指定泛型的数据
(b) default Consumer<T> andThen(Consumer<? super T> after) 如果一个方法的参数和返回值全都是Consumer类型,那么就可以实现效果:消费一个数据的时候,首先做一个操作,然后再做一个操作,实现组合。而这个方法就是Consumer接口中default方法andThen。
4、 小结
4.1方法引用的好处
简化Lambda表达式
重复利用已经存在方
4.2 函数式接口、Lambda表达式、方法引用之间的联系
接口:主要是定义统一的调用规范,所以接口方法的名字一般是长期固定不变,且需要经常调用。
接口方法的具体实现在项目中经常变动,所以用接口方法名调用接口实现类的重写方法,可以起到少改动项目代码的效果。
因为函数式接口中只有一个抽象方法,所以Lambda表达式、方法引用可以省略掉接口中唯一的抽象方法的名字。Lambda表达式、方法引用都是只定义了方法的实现,但是没有调用方法。
Lamda表达式、方法引用的实际调用,一般是用接口实现类对象调用接口唯一抽象方法名。
最新文章
- log4j.properties配置
- 第一次作业——subway
- Pyunit测试框架
- [SQL]SQL语言入门级教材_SQL语法参考手册(三)
- Mysql 自动增长 重置
- 查mysql字段中的数字记录
- js运动 缓冲运动
- LinQ综合应用实例
- warning: control reaches end of non-void function
- 读书笔记 effective c++ Item 42 理解typename的两种意义
- hack在微信等webview中无法修改document.title的情况
- 【NO.12-1】Jmeter - 在Linux执行性能测试的方法 [1]
- C#委托的使用及案例
- hdu 5492 (暴力+nice)
- 从app上传图片到php,再上传到java后端服务器的方法一条龙服务
- 用DDD模拟案例分析
- FTL 数字有逗号
- SELECT查询结果集INSERT到数据表
- log4j的NDC/MDC区别与应用
- pyDay16