一. Java基础
(十二)函数式编程
此“函数”类似于数学中函数(强调做什么),只要输入数据一致返回结果也一致。
- 数学中函数:2x+1
- Java中函数( lambda表达式 ):(x) -> 2x+1
【函数式编程】:使用使用lambda函数可以替代某些匿名内部类对象,从而让程序代码更简洁,可读性更好。
1. lambda
(1)基本概念
Lambda 表达式(或匿名函数)是函数式编程的一个重要特性,允许你以一种简洁的方式表达匿名函数(即没有名称的函数)。在许多现代编程语言中,Lambda 表达式让你能够快速定义和传递行为,而不需要定义一个单独的命名函数。
在 Java 中,Lambda 表达式的基本语法是:
(parameters) -> {expression}
- parameters:是 Lambda 表达式的输入参数,即被重写方法的形参列表。
- ->:箭头符号,表示"从"。
- expression:Lambda 表达式的主体,即被重写方法的方法体代码。
(2)函数式接口和@FunctionalInterface
注意:Lambda表达式并不可以简化全部的匿名内部类,Lambda只能简化函数式接口的匿名内部类。
【函数式接口】:有且仅有一个抽象方法的接口
-----函数式接口 必须 只包含 一个抽象方法,但是它 可以 包含其他成员,如常量、静态方法、默认方法等。
我们可以用【@FunctionalInterface】声明一个函数式接口,该注解用于约束当前接口必须是函数式接口:
@FunctionalInterface public interface MyFunctionalInterface { void abstractMethod(); // 抽象方法 }
Arrays.sort(numbers, (a, b) -> b - a);就是很常见的一种用lambda表达式
简化匿名内部类的写法:
如果不使用 Lambda 表达式,通常我们会使用匿名内部类来实现 Comparator
接口。它的写法相对较为冗长:
Arrays.sort(numbers, new Comparator<Integer>() {
@Override
public int compare(Integer a, Integer b) {
return b - a; // 降序排序
}
});
Lambda 表达式将上述匿名内部类简化为:
Arrays.sort(numbers, (a, b) -> b - a);
(3)Lambda 表达式的省略规则
- 参数类型可以全部省略不写
- 如果只有一个参数,参数类型省略的同时“()”也可以省略,但是多个参数不能省略“()”;
- 如果Lambda 表达式中只有一行代码,大括号可以不写,同时要省略分号“;”,并且如果这行代码是return语句,也必须去掉return。
2. 方法引用
Lambda 表达式可以简化函数式接口的匿名内部类,而方法引用是用于简化Lambda 。
(1)静态方法引用
- 格式:【类名::静态方法】
- 使用场景:如果某个Lambda表达式里只是调用一个静态方法,并且“—>”前后参数形式一致,就可以使用静态方法引用。
如:
import java.util.Arrays;
public class StaticMethodReferenceExample {
public static void main(String[] args) {
Integer[] numbers = {1, 3, 2, 5, 4};
// 使用静态方法引用进行排序
Arrays.sort(numbers, Integer::compare);//静态方法引用
// 输出排序后的数组
System.out.println(Arrays.toString(numbers));
}
}
-- 上例中的
Integer::compare
是对Integer