1、函数式接口
只有一个抽象方法的接口就叫函数式接口,Runnable 接口中只有一个 run()
方法,所以 Runnable 接口就是一个函数式接口。
只要是函数式接口,就可以用 lambda 表达式简化。
1 | public interface Runnable { |
对于函数式接口,可以通过 lambda 表达式来创建该接口的对象,避免匿名内部类定义过多,可以让代码更简洁的一种表示方法。
2、lambda 表达式(JDK 8)
使用 lambda 表达式简化一个函数式接口对象的过程:普通实现类 -> 静态内部类 -> 局部内部类 -> 匿名内部类 -> lambda表达式
1 | // 定义一个函数式接口 |
Lambda 表达式本身还可以进行简化
比如函数式接口 Runnable 使用 Lambda 表达式不断简化:去掉参数类型 -> 去括号 -> 去花括号
1 | interface ILoveLambda { |
简化的注意事项
接口必须是函数式接口;
方法如果有多个参数也可以去掉参数类型,但是参数类型要去掉就都去掉,去掉之后必须加上括号;
Lambda 表达式只能在有一行代码的情况下才能简化成一行,如果有多行就用代码块包裹。
3、四大函数式接口
3.1、Supplier
java.util.function.Supplier<T>
接口,仅包含一个无参的方法:T get()
,用来获取一个泛型参数指定类型的对象数据
Supplier 接口被称之为生产型接口,传入一个泛型 T,将返回一个泛型 T。泛型如果不进行特别指定会默认为 Object,注意要与函数式接口的传入返回类型相匹配。
测试
1 | public class _01_SupplierDemo_get { |
3.2、Consumer
https://blog.csdn.net/weixin_44230693/article/details/113847162
java.util.function.Consumer
接口则正好与 Supplier 接口相反,它不是生产一个数据,而是消费一个数据, 其数据类型由泛型决定。
accept 方法
消费一个指定泛型的数据
测试
1 | public class _02_ConsumerDemo_accept { |
andThen 方法
如果一个方法的参数和返回值全都是 Consumer 类型,在消费数据的时候,可以首先做一个操作,然后再做一个操作,实现组合。由 Consumer 接口中的 default 方法 andThen()
可以实现。
1 | default Consumer<T> andThen(Consumer<? super T> after) { |
Consumer 接口的默认方法 andThen:需要两个 Consumer 接口,可以把两个 Consumer 接口组合到一起,再对数据进行消费。
1 | Consumer<String> con1 |
测试
1 | public class _03_ConsumerDemo_andThen { |
3.3、Function
Function:函数型接口,有一个输入参数,有一个输出参数。
源码
1 |
|
测试:将输入的小写字母转换为大写
1 | public class _04_FunctionDemo { |
3.4、Predicate
Predicate:断定型接口,只有一个输入参数,返回值只能是 boolean 值。
源码
1 |
|
测试:判断字符串是否为空
1 | public class _05_PredicateDemo { |
-------------Thanks for your time.-------------