详细参考
https://blog.csdn.net/chenshun123/article/details/78122467
一、Lambda表达式,主要是简化函数式接口(接口只包含一个抽象方法,可以在接口前使用注解@FunctionalInterface
检查该接口是否为函数式接口)的写法,使代码更加简洁,减少冗余代码。
基本语法:
-
// 语法格式一:无参数数无返回值
Runnable r8 = () -> System.out.println("Runnable!");
// 语法格式二:有一个参数无返回值(Consumer为JDK的一个接口,具体可以参考源码)
Consumer<String> con = (x) -> System.out.println(x);
con.accept("Hello Lambda!");
// 语法格式三:只有一个参数时,小括号可以省略(当然不太建议省略)
Consumer<String> consumer = x -> System.out.println(x);
// 语法格式四:多个参数、多条语句(使用大括号)、有返回值
Comparator<Integer> c1 = (x, y) -> {
System.out.println("函数式接口!");
return Integer.compare(x, y);
};
// 语法格式五:多个参数、只有一条语句(可以省略大括号)、有返回值(可以省略return)
Comparator<Integer> c2 = (x, y) -> Integer.compare(x, y);
// 语法格式六:Lambda表达式的参数列表的参数类型可以省略!是因为JVM编译时可以通过上下文推断出数据类型: 也就是类型推断!
代码示例:
(1) java内置方法:
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("测试");
}
}).start();
new Thread(() -> System.out.println("测试")).start();
(2)自定义方法示例:
@FunctionalInterface
public interface FunctionMethod {
public abstract void functionTest();
}
FunctionMethod functionMethod = new FunctionMethod() {
@Override
public void functionTest() {
}
};
FunctionMethod functionMethod2 = () -> System.out.println("");
需求 : 雇员对象如下,有一个包含许多员工信息的对象 employees,要求获取当前公司中员工年龄大于 35 的员工信息
public class Employee {
private String name;
private int age;
public Employee() {
}
public Employee(String name, int age) {
this.name = name;
this.age = age;
}
// ...
@Override
public String toString() {
return "Employee{" + "name='" + name + '\'' + ", age=" + age + '}';
}
}
最简单的方式是采用 foreach 循环遍历,以下是各种优化方式
优化方式一 : 策略设计模式
@FunctionalInterface
public interface MyPredicate<T> {
boolean test(T t);
}
public class FilterEmployeeByAge implements MyPredicate<Employee> {
@Override
public boolean test(Employee employee) {
return employee.getAge() >= 35;
}
}
public List<Employee> filterEmployees3(List<Employee> employees, MyPredicate<Employee> myPredicate) {
List<Employee> emps = new ArrayList<>();
for (Employee employee : employees) {
if (myPredicate.test(employee)) {
emps.add(employee);
}
}
return emps;
}
调用
List<Employee> emps = filterEmployees3(employees, new FilterEmployeeByAge());
for (Employee employee : emps) {
System.out.println(employee.toString());
}
优化方式二 : 匿名内部类
List<Employee> emps = filterEmployees3(employees, new MyPredicate<Employee>() {
@Override
public boolean test(Employee employee) {
return employee.getAge() >= 35;
}
});
for (Employee employee : emps) {
System.out.println(employee.toString());
}
优化方式三 : Lambda
filterEmployees3(employees, employee -> employee.getAge() >= 35).forEach(System.out::println);优化方式四 : Stream API
employees.stream().filter((employee) -> employee.getAge() >= 35).limit(5).forEach(System.out::println);