持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第19天,点击查看活动详情
1. 函数式编程
函数式编程就是在程序代码中使用函数式接口来简化臃肿的代码逻辑,带来体验上的提升。
1.1 函数式接口
Functional Interface,即函数式接口,是指有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。函数式接口可以被隐式转换为 Lambda 表达式,并且该表达式对象可以作为参数传入相关方法中进行执行。
函数式接口是适用于函数式编程场景的接口,Java 中的函数式编程体现就是 Lambda 语法,因此 Java 的函数式接口就是可以适用于 Lambda 使用的接口。只有确保接口中有且仅有一个抽象方法,Java 中的 Lambda 才能顺利地使用。
1.2 Java 中的函数式接口
-
Java8 (JDK 1.8) 之前的函数式接口
-
java.lang.Runnable
-
java.util.concurrent.Callable
-
java.security.PrivilegedAction
-
java.util.Comparator
-
java.io.FileFilter
-
java.nio.file.PathMatcher
-
java.lang.reflect.InvocationHandler
-
java.beans.PropertyChangeListener
-
java.awt.event.ActionListener
-
javax.swing.event.ChangeListener
-
-
JDK 1.8 新增加的函数式接口
-
java.util.function
-
即在 java.util.function 包下的接口都是函数式接口,分别对应不同的类型,包括 Supplier、Consumer、Function、Predicate 等
-
2. Java8 函数式编程的四大基本接口
2.1 供给型函数接口
interface Supplier<T> ,Supplier 是一种不接收任何输入参数,却可以输出一个 T 类型结果的函数式接口。
// 定义 supplier 函数对象
Supplier<String> supplier = () -> {
System.out.println("不接收参数,输出一个结果");
return "Hello Supplier!";
}
// supplier 中的抽象方法 get() ,方法体即初始化时传入的表达式,可以调用执行
String result = supplier.get();
- 结果会打印指定内容,并返回固定内容
2.2 消费型函数接口
interface Consumer<T> ,Consumer 属于接收一个 T 类型的输入参数,却无任何结果输出的函数式接口。
// 定义 Consumer 函数对象
Consumer<Integer> consumer = a -> System.out.println(a * a);
// 执行 Consumer 对象中实现的 accept() 方法
consumer.accept(10);
- Consumer 函数接口的 accept() 方法无返回值,但是方法中执行的打印逻辑会正常打印执行
2.3 断言型函数接口
interface Predicate<T> , Predicate 接口接受一个输入参数,并返回一个布尔值结果,实现常用于对参数进行相关逻辑判断。
// 定义 Predicate 判断表达式对象
Predicate<String> predicate = s -> StringUtils.equals(s,"Predicate");
// 执行对象中的 test() 方法,即执行判断逻辑
boolean result = predicate.test("Prediccate");
- 结果输出 true,即传入参数满足判断表达式的逻辑判断
2.4 标准函数型函数接口
interface Function<T, R> ,Function 是一种标准的函数接口,可以接受一个参数,并可以输出一个返回结果。
// 定义 Function 对象表达式
Function<Integer,Integer> function = n -> a * a;
// 执行 Function 对象的 apply() 方法,传入参数,并返回结果
Integer result = function.apply(5);
- 输入 5 ,执行 5 * 5,输出结果 result= 25
3. 其他函数式接口
Java8 中支持了函数式编程,并将 Lambda 语法引入,这些特性使得 Java 语言有了更好的操作体验,在 JDK 1.8 之前,Java 中也存在一些函数式接口,如常见的 Runnable 接口、Callable 接口、Comparator 接口等。
3.1 Comparator 函数接口
interface Comparator<T> , Comparator 是 Java8 之前就已经存在 java.util 包中的函数式接口,它可以接受两个 T 类型的参数,并返回 int 类型的结果值,常用于对象的排序方法,返回结果为负数则代表第一个数小于第二个数,返回 0 代表相等,返回正整数则代表大于关系。
// 使用 lambda 表达式定义 Comparator 函数对象
Comparator<User> comparator = (u1, u2)->u1.getAge().compareTo(u2.getAge());
// 通过调用 compare() 方法来执行定义的表达式
int result = comparator.compare(user1,user2);
- 最终结果返回 user1 和 user2 中 age 属性的大小比较结果