Java的四大函数式接口

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

原文地址:https://www.cnblogs.com/majestyking/p/12458002.html