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