lambda表达式的使用
测试类
package com.shujia.day21.lambdademo4;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/*
案例3:使用匿名内部类改进
现在有一个存储员工的集合,员工id, name, age, salary
需求1:过滤出年龄是大于18岁的,返回新的集合
需求2:过滤出薪资是大于10000,返回新的集合
使用lambda表达式改写的前提:
1、要有一个接口
2、接口中有且仅有一个抽象方法
两个前提同时满足才可以使用lambda表达式改进
lambda表达式写法:
(xxx,xxx,...) -> {
xxxx;
return xxx;
}
Lambda 是一个匿名函数,我们可以把Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。
可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。
Lambda和匿名内部类的区别
Lambda是一个逻辑而匿名内部类是一个具体的类
Lambda 表达式底层Lambda 表达式被封装成了主类的一个私有方法,并通过 invokedynamic 指令进行调用,
并且书写 Lambda 表达式不会产生新的类。所以不能单纯的理解Lambda表达式和匿名内部类的实现原理是一样的,
但是可以理解为简化匿名内部类的写法。
*/
public class StaffDemo1 {
private static List<Staff> staffList = Arrays.asList(
new Staff("1001", "魏一民", 19, 11000),
new Staff("1002", "陈真", 18, 12000),
new Staff("1003", "李建国", 15, 7500),
new Staff("1004", "徐思远", 16, 8000),
new Staff("1005", "李卓", 29, 40000)
);
public static void main(String[] args) {
//调用方法进行过滤
List<Staff> staffList1 = filterStaff(staffList, (e)->{
boolean b = e.getAge() > 18;
return b;
});
/**
* () : 表示的是接口中那个唯一方法的参数
* e : 运行过程中方法接收的参数
* -> : lambda表达式标志,左边是参数,右边是方法体。
*/
for (Staff staff : staffList1) {
System.out.println(staff);
}
System.out.println("==========================================");
List<Staff> staffList2 = filterStaff(staffList, e -> e.getSalary() > 10000);
for (Staff staff : staffList2) {
System.out.println(staff);
}
}
public static List<Staff> filterStaff(List<Staff> staffList, FilterCondition filterCondition) {
ArrayList<Staff> list = new ArrayList<>();
for (Staff staff : staffList) {
if (filterCondition.filter(staff)) {
list.add(staff);
}
}
return list;
}
}
员工类
package com.shujia.day21.lambdademo4;
public class Staff {
private String id;
private String name;
private int age;
private int salary;
public Staff() {
}
public Staff(String id, String name, int age, int salary) {
this.id = id;
this.name = name;
this.age = age;
this.salary = salary;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
@Override
public String toString() {
return "Staff{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", age=" + age +
", salary=" + salary +
'}';
}
}
接口
package com.shujia.day21.lambdademo4;
@FunctionalInterface
public interface FilterCondition {
boolean filter(Staff staff);
}