Java Lambda表达式是一种简化函数式编程的语法特性,主要用于简化只有一个抽象方法的接口(函数式接口)的实现。以下是Lambda表达式的基本概念:
函数式接口:只有一个抽象方法的接口。Java 8中的@FunctionalInterface注解可以用于显式声明函数式接口。
- Lambda表达式语法:(parameters) -> expression或(parameters) -> { statements; }。parameters是参数列表,expression或statements是函数体。
- 类型推断:Java编译器可以根据上下文推断Lambda表达式的参数类型和返回类型。
- 变量捕获:Lambda表达式可以访问其作用域内的局部变量,但局部变量必须是隐式或显式的final。
Comparator接口
Java中的Comparator接口是一个函数式接口,用于定义对象比较的规则。它主要用于对集合中的元素进行排序或比较。Comparator接口定义了一个compare(T o1, T o2)方法,用于比较两个对象。
下面是一个使用Comparator接口的Java代码示例。在这个示例中,我们创建了一个Person类和一个实现了Comparator接口的AgeComparator类。然后,我们使用Collections.sort()方法对Person对象列表进行排序。
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
class Person {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "Person{" + "name='" + name + '\'' + ", age=" + age + '}';
}
}
class AgeComparator implements Comparator<Person> {
@Override
public int compare(Person p1, Person p2) {
return Integer.compare(p1.getAge(), p2.getAge());
}
}
public class ComparatorExample {
public static void main(String[] args) {
List<Person> people = new ArrayList<>();
people.add(new Person("Alice", 30));
people.add(new Person("Bob", 25));
people.add(new Person("Charlie", 35));
Collections.sort(people, new AgeComparator());
System.out.println("Sorted by age:");
for (Person person : people) {
System.out.println(person);
}
}
}
运行这段代码,输出结果如下:
Sorted by age:
Person{name='Bob', age=25}
Person{name='Alice', age=30}
Person{name='Charlie', age=35}
这个示例展示了如何使用Comparator接口对Person对象列表按年龄进行排序。
Lambda表达式的语法
Lambda表达式的语法如下:
(parameters) -> expression
或者
(parameters) -> { statements; }
- 参数:可以是零个、一个或多个参数,用逗号分隔。参数类型可以省略,编译器会自动推断。
- 箭头符号:用于分隔参数和表达式或语句块。
- 表达式或语句块:如果是单个表达式,可以直接返回结果;如果是语句块,需要用大括号包围,并在需要返回值的地方使用return语句。
以下是一些Lambda表达式的示例:
// 无参数,返回一个字符串
() -> "Hello, world!"
// 一个参数,返回参数的平方
x -> x * x
// 两个参数,返回它们的和
(x, y) -> x + y
// 两个参数,返回它们的最大值
(x, y) -> {
if (x > y) {
return x;
} else {
return y;
}
}
Lambda表达式可以用于简化代码,例如在实现Comparator接口或使用Stream API时。
Lambda表达式简化Comparator接口
下面是一个使用Lambda表达式简化Comparator接口实现的Java代码示例。在这个示例中,我们创建了一个Person类,并使用Lambda表达式创建了一个Comparator对象。然后,我们使用Collections.sort()方法对Person对象列表进行排序。
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
class Person {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "Person{" + "name='" + name + '\'' + ", age=" + age + '}';
}
}
public class LambdaComparatorExample {
public static void main(String[] args) {
List<Person> people = new ArrayList<>();
people.add(new Person("Alice", 30));
people.add(new Person("Bob", 25));
people.add(new Person("Charlie", 35));
Comparator<Person> ageComparator = (p1, p2) -> Integer.compare(p1.getAge(), p2.getAge());
Collections.sort(people, ageComparator);
System.out.println("Sorted by age:");
for (Person person : people) {
System.out.println(person);
}
}
}
运行这段代码,输出结果如下:
Sorted by age:
Person{name='Bob', age=25}
Person{name='Alice', age=30}
Person{name='Charlie', age=35}
这个示例展示了如何使用Lambda表达式简化Comparator接口实现,并对Person对象列表按年龄进行排序。