1.什么是函数式接口:
函数式接口是 Java8 引入的一个新特性,是一种特殊的接口:SAM类型的接口(Single Abstract Method),但本质上还是接口。
相比较于其他接口,函数式接口有且只能有一个抽象方法。只要接口中出现多个抽象方法,那么就不能称之为函数式接口,运行的时候就会报错。
为此 Java8 提供了一个新的注解@FunctionalInterface,如果接口被这个注解标注,就说明该接口是函数式接口,如果有多于一个的抽象方法,在编译的时候就会报错。
但是这个注解不是必需的,只要接口符合函数式接口的定义,那么这个接口就是函数式接口。
比如以下接口就是函数式接口
java.lang.Runnable java.util.concurrent.Callable<V>
foreach循环的参数也是函数式接口,而且是consumer类型的函数式接口
2.函数式接口的特点:
相比其它接口,函数式接口的特点:
原则上讲,函数式接口中有且只能有一个抽象方法
但是在 Java8 之后接口中也是可以定义方法的:默认方法和静态方法,这两种方法的定义并不会影响函数式接口的定义,可以随意使用。即:
接口中可以有一个或多个静态方法,这不会影响到函数式接口的定义
在 Java8 之后,接口允许定义由 default 修饰的默认方法。这些方法也不会影响到函数式接口的定义
可以有顶级父类Object中 public 类型 的覆盖方法。比如覆盖父类中的:equals,toString,hashcode等方法
函数式接口也支持继承,可以继承多个父接口,但是每个父接口只能有一个抽象方法,且必须是相同的抽象方法。
函数式接口的使用,使的我们可以将方法当作参数来传递。在调用时,lambda 表达式作为参数来使用。换句话说,当一个方法的参数是 lambda 表达式时,这个参数类型一定是函数式接口.
3.函数式接口的作用:
它是一种特殊的接口,它也是SAM类型的接口(Single Abstract Method)类型的接口。
函数式接口也是多线程高并发编程的一部分。
函数式接口是大数据scala的基石,需要认真学习,好好把握。
4.四大常见函数式接口:
5.以下是实现上面四大接口的代码示例:
1 import java.util.function.Consumer; 2 import java.util.function.Function; 3 import java.util.function.Predicate; 4 import java.util.function.Supplier; 5 6 public class FunctionInterfaceDemo { 7 public static void main(String[] args) { 8 //用lambda表达式定义了一个函数型接口 9 Function<String, String> function = (str) -> { 10 return str; 11 }; 12 System.out.println(function.apply("I am a funcitonal interface.")); 13 14 //用lambda表达式定义了一个断定型接口,断定型接口会返回一个布尔值 15 Predicate<String> predicate = (str) -> { 16 return str.isEmpty(); 17 }; 18 System.out.println(predicate.test("Hello World.")); 19 20 //用lambda表达式定义了一个消费型接口 21 Consumer<String> consumer = (str) -> { 22 System.out.println(str); 23 }; 24 25 consumer.accept("baozi"); 26 27 //用lambda表达式定义了一个供给型接口 28 Supplier<String> supplier = () -> { 29 return "厨师不要钱,并向吃货扔了一个包子"; 30 }; 31 System.out.println(supplier.get()); 32 } 33 }
结果:
I am a funcitonal interface. false baozi 厨师不要钱,并向吃货扔了一个包子
后记:
2020年3月10日 星期二 上海 晴 农历2020年二月二七
参考:
java流式编程
https://segmentfault.com/a/1190000019855034
java链式编程
https://blog.csdn.net/u010061287/article/details/78953591
java接口
https://blog.csdn.net/qq_19782019/article/details/80259836