Java中的Lambda表达式是Java 8引入的一个关键特性,它提供了一种清晰而简洁的方式来表示只有一个抽象方法的接口(即函数式接口)的实例。Lambda表达式允许你以更简洁的方式编写匿名内部类(作用),使代码更加简洁易读。下面详细讲解Java中的Lambda表达式。
1. Lambda表达式的基本语法
Lambda表达式的基本语法如下:
(被重写方法的形参列表)-> {
被重写方法的方法体代码
}
2. 函数式接口
Lambda表达式本质上是一个匿名方法,但是Java是面向对象的,所以Lambda表达式必须有一个目标类型,这个类型必须是函数式接口。Lambda表达式只能简化函数式接口的匿名内部类!!!
什么是函数式接口
函数式接口是只包含一个抽象方法的接口(可以有多个默认方法或静态方法)。
Java 8引入了@FunctionalInterface
注解来标识一个接口是函数式接口,但这并不是强制的,只要接口满足函数式接口的定义即可。
3.接下来带大家来实现一个Lambda表达式:
先展示一个基础代码:
Array.sort(students,new Comparator<Student>() {
@Override
puublic int compare(Student o1,Student o2){
return Double.compare(o1.getHeight(),o2.getHeight());//升序
}
});
根据规则我来写成Lambda表达式
Array.sort(students,
new Comparator<Student>() {(Student o1,Student o2){
@Override
puublic int compare
return Double.compare(o1.getHeight(),o2.getHeight());//升序
}
});最终结果:
Array.sort(students ,(Student o1,Student o2) ->{
return Double.compare(o1.getHeight(),o2.getHeight());//升序
});
4.Lambda的省略写法
我们在演示一下
Array.sort(students ,(
Studento1,Studento2) ->{
returnDouble.compare(o1.getHeight(),o2.getHeight());//升序});最终结果:
Array.sort(students ,(o1 ,o2) ->Double.compare(o1.getHeight(),o2.getHeight()));
4.补充:
在Java中,Lambda表达式提供了一种更简洁的方式来表示匿名内部类,尤其在处理函数式接口时非常有用。Java 8引入了方法引用(Method References)的概念,它可以进一步简化Lambda表达式的写法。方法引用主要有以下几种形式:
静态方法引用
静态方法引用允许你直接引用一个类的静态方法。语法是ClassName::staticMethodName
。
例子:
List<String> strings = Arrays.asList("apple", "banana", "cherry");
// 使用Lambda表达式
strings.sort((s1, s2) -> s1.compareToIgnoreCase(s2));
// 使用静态方法引用
strings.sort(String::compareToIgnoreCase);
在这个例子中,String::compareToIgnoreCase
就是一个静态方法引用,它指向了String
类的compareToIgnoreCase
静态方法。
实例方法引用
实例方法引用允许你引用一个对象的实例方法。语法是instance::instanceMethodName
。
例子:
List<String> strings = Arrays.asList("apple", "banana", "cherry");
// 使用Lambda表达式
strings.forEach(s -> System.out.println(s));
// 使用实例方法引用
strings.forEach(System.out::println);
在这个例子中,System.out::println
是一个实例方法引用,它引用了System.out
对象的println
方法。
特定类型的方法引用
特定类型的方法引用是指对特定类型的对象的方法进行引用,通常是泛型接口中的方法。语法是TypeName::methodName。
List<Person> people = Arrays.asList(new Person("Alice"), new Person("Bob"));
// 使用Lambda表达式
people.forEach(p -> p.printName());
// 使用特定类型的方法引用
people.forEach(Person::printName);
在这个例子中,Person::printName
是一个特定类型的方法引用,它引用了Person
类的实例方法printName
。