函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
每一个函数式接口都可以用lambda表达式来简化。
为什么说这玩意重要呢?在jdk1.5的时候三大特性我们必须要学会,泛型、枚举、注解,而作为一个现代java程序员,必须要会的是函数式接口,这个还是jdk1.8的特性,现在jdk已经发展到14了,各位小伙伴怎么可以连1.8的特性都不会呢?这时候又有一些小伙伴要说了,我也不会函数式接口,但这丝毫不影响我开发,那么问题来了,你不用,总会有别人用,新一代的框架大量使用函数式接口编程,如果不会这个玩意,估计以后看源码都看不懂了。
接下来是正题,我们下面讲解四个最经典的函数式接口吧。
1. 函数式接口
我们先来看一波源码:
看源码我们可以了解到,函数式接口有两个泛型,一个约定着入参类型,一个约定着返回值类型,我们代码实现一下,我们输入一串字符串,就让它返回这个字符串://函数式接口
Function function1 = new Function() {
@Override
public String apply(String str) {
return str;
}
};
调用一下上面的代码:System.out.println(function1.apply("aaa"));
控制台打印:
我们上面说过,每一个函数式接口都可以用lambda表达式简化,下面我们来试一下用lambda表达式简化一下代码://lambda表达式优化
Function function2 = (str) -> {return str;};
Function function3 = str-> str;
System.out.println(function2.apply("bbb"));
System.out.println(function3.apply("ccc"));
控制台打印:
2. 断定型接口
老规矩,源码走一波:
这下我们又突然恍然大悟,断定型接口就是只有一个入参,返回值为boolean类型,就TM你叫夏洛啊?就TM你叫断定型接口啊?
代码实现,我们来判断一下入参是否大于0,如果大于就返回true,否则返回false://断定式接口
Predicate predicate = new Predicate() {
@Override
public boolean test(Integer num) {
return num > 0;
}
};
//lambda简化
Predicate predicate2 = (num) -> num > 0;
System.out.println(predicate.test(1));
System.out.println(predicate.test(-1));
System.out.println(predicate2.test(1));
System.out.println(predicate2.test(-1));
控制台打印:
3. 消费型接口
学完上面两个函数式接口,我相信聪明的小伙伴已经能看懂了,消费型接口,只有一个入参,没有返回值。
代码实现,让他在方法体里面输出我们入参给的数据://消费型接口
Consumer consumer = new Consumer() {
@Override
public void accept(String s) {
System.out.println(s);
}
};
//lambda简化
Consumer consumer2 = (str)->{System.out.println(str);};
consumer.accept("hello");
consumer2.accept("world");
控制台打印:
4. 供给型接口
供给型接口,只有返回值,没有入参,我估计现在有的小伙伴都能举一反三抢答了~很棒。
代码实现://供给型接口
Supplier supplier = new Supplier() {
@Override
public String get() {
return "liqinglin";
}
};
//lambda简化
Supplier supplier1 = ()->{return "hahaha";};
System.out.println(supplier.get());
System.out.println(supplier1.get());
控制台打印:
好了,这就是比较常用的四种函数式接口,小伙伴是不是感觉很简单呢!