看懂了这篇-你就懂了函数式接口
函数式编程是一种编程规范或一种编程思想,简单可以理解问将运算或实现过程看做是函数的计算。 Java8为了实现函数式编程,提出了3个重要的概念:Lambda表达式、方法引用、函数式接口。现在很多公司都在使用lambda表达式进行代码编写,甚至知名的Java的插件也都在Lambda,比如数据库插件MybatisPlus。Lambda表达式的使用是需要函数式接口的支持,即lambda表达式的核心就是使用大量的函数式接口。本文带领大家全面了解函数式接口的定义和使用。
一、文章导读
- 函数式接口概述
- 自定义函数式接口
- 常用函数式接口
- 函数式接口的练习
二、函数式接口概述
1.函数式接口定义
如果接口里只有一个抽象方法,那么就是函数式接口,可以使用注解(@FunctionalInterface)检测该接口是否是函数式接口,即只能有一个抽象方法。
注意事项
函数式接口里可以定义默认方法:默认方法有方法体,不是抽象方法,符合函数式接口的定义要求。
函数式接口里可以定义静态方法:静态方法也不是抽象方法,是一个有具体方法实现的方法,同样也符合函数式接口的定义的。
函数式接口里可以定义Object里的public方法(改成抽象方法):虽然它们是抽象方法,却不需要覆盖重写,因为所有接口的实现类都是Object类的子类,而在Object类中有这些方法的具体的实现。
2.函数式接口格式
修饰符 interface 接口名称 {
//抽象方法
public abstract 返回值类型 方法名称(可选参数信息);
//默认方法
public default 返回值类型 方法名称(可选参数信息) {
//代码...
}
//静态方法
public static 返回值类型 方法名称(可选参数信息) {
//代码...
}
//Object类的public方法变成抽象方法
public abstract boolean equals(Object obj);
public abstract String toString();
}
三、自定义函数式接口
1.自定义函数式接口举例
由于接口当中抽象方法的public abstract
是可以省略的,所以定义一个函数式接口很简单:
@FunctionalInterface
public interface MyFunctionalInterface {
//抽象方法
public abstract void method();
//Object类的public方法变成抽象方法
public abstract boolean equals(Object obj);
public abstract String toString();
//默认方法
public default void show(String s) {
//打印小写
System.out.println(s.toLowerCase());
}
//静态方法
public static void print(String s) {
//打印大写
System.out.println(s.toUpperCase());
}
}
2.自定义函数式接口的应用
对于刚刚定义好的MyFunctionalInterface
函数式接口,典型使用场景就是作为方法的参数:
public class Demo01FunctionalInterface {
public static void main(String[] args) {
// 调用使用函数式接口的方法
show(()->{
System.out.println("Lambda执行了");
});
}
//定义方法使用函数式接口作为参数
public static void show(MyFunctionalInterface mfi) {
//调用自己定义的函数式接口
mfi.method();
String s = mfi.toString();
System.out.println(s);
boolean result = mfi.equals(mfi);
System.out.println(result);
mfi.show("world");
MyFunctionalInterface.print("function");
}
}
3.运行结果:
Lambda执行了
Demo01FunctionalInterface$$Lambda$1/1078694789@3d075dc0
true
world
FUNCTION
四、常用函数式接口
前面我们自己定义了一个函数式接口,对于一些常用的函数式接口,每次自己定义非常麻烦。JDK提供了大量常用的函数式接口以丰富Lambda的典型使用场景,它们主要在`java.util.function`包中被提供。这样的接口有很多,下面是最简单的几个接口及使用示例。
1. Supplier接口
java.util.function.Supplier<T>
接口,它意味着"供给" , 对应的Lambda表达式需要“对外提供”一个符合泛型类型的对象数据。
1.1.抽象方法 : get
Supplier`接口中包含一个抽象方法` T get(): 用来获取一个泛型参数指定类型的对象数据。
public class Demo02Supplier {
public static void main(String[] args) {
int num = getNum(() -> {
return new Random().nextInt();
});
System.out.println(num);
}
public static int getNum(Supplier<Integer> supplier) {
int num = supplier.get();
return num;
}
}
1.2.求集合元素最大值
使用Supplier
接口作为方法参数类型,通过Lambda表达式求出List集合(存储int数据)中的最大值。提示:接口的泛型请使用java.lang.Integer
类。
代码示例:
public class Demo03Supplier {
public static void main(String[] args) {
List<Integer> list = new ArrayList