Java8的lambda表达式学习记录
参考教程:https://www.bilibili.com/video/BV1ut411g7E9?spm_id_from=333.999.0.0
一,Lambda表达式
Lambda 表达式是 JDK8 的一个新特性,可以取代大部分的匿名内部类,写出更优雅的 Java 代码,尤其在集合的遍历和其他集合操作中,可以极大地优化代码结构。JDK 也提供了大量的内置函数式接口供我们使用,使得 Lambda 表达式的运用更加方便、高效。
虽然使用 Lambda 表达式可以对某些接口进行简单的实现,但并不是所有的接口都可以使用 Lambda 表达式来实现。Lambda 规定接口中只能有一个需要被实现的方法,不是规定接口中只能有一个方法
jdk 8 中有另一个新特性:default, 被 default 修饰的方法会有默认实现,不是必须被实现的方法,所以不影响 Lambda 表达式的使用。
二,问题
- 新建一个集合
//实体类
public class Employee {
private String name;
private int age;
private double salary;
}
//测试类
List<Employee> employees = Arrays.asList(//ArrayList的内部类,数组转集合,固定长度,具体参考 https://blog.csdn.net/kzadmxz/article/details/80394351
new Employee("张三", 18, 9999.99),
new Employee("李四", 20, 7777.77),
new Employee("王五", 36, 5555.55),
new Employee("赵六", 50, 3333.33),
new Employee("田七", 10, 2222.22)
);
//找出集合中年龄大于35岁的人
三,面向对象思想
//面向对象的写法
public List<Employee> filterEmployees(List<Employee> list){
List<Employee> emps = new ArrayList<>();
for (Employee e : list) {
if (e.getAge() > 35) {
emps.add(e);
}
}
return emps;
}
四,使用策略模式
//1,新建策略接口
public interface MyPredicate<T> {
public boolean Test(T t);
}
//2,新建策略接口实现类
public class FilterEmployeeByAge implements MyPredicate<Employee>{
@Override
public boolean Test(Employee employee) {
return employee.getAge() > 35;
}
}
//3,新建策略模式调用方法
public List<Employee> filterEmployees(List<Employee> list, MyPredicate mp){//把设计好的策略实现传进来即可
List<Employee> emps = new ArrayList<>();
for (Employee e : list) {
if (mp.Test(e)){//这里会调用策略方法
emps.add(e);
}
}
return emps;
}
//4,具体业务逻辑上调用策略模式实现
@Test
public void test4(){//求年龄大于35岁的人
List<Employee> list = filterEmployees(employees, new FilterEmployeeByAge());//将第二步的策略实现类放到这里来即可
for (Employee e : list) {
System.out.println(e);
}
}
五,匿名内部类
public void test5(){
List<Employee> list = filterEmployees(employees, new MyPredicate<Employee>() {//直接实例化这个接口重写里面的策略方法
@Override
public boolean Test(Employee employee) {
return employee.getAge() > 35;
}
});
for (Employee e : list) {
System.out.println(e);
}
}
六,lambda表达式(匿名内部类的另一种写法)
public void test6(){
List<Employee> list = filterEmployees(employees, (MyPredicate<Employee>) e -> e.getAge()>35);//匿名内部类简写为lambda表达式,(MyPredicate<Employee>),类似实例化了这个接口
for (Employee e : list){
System.out.println(e);
}
}
七,Stream流,Stream API
public void test7(){
employees.stream().filter((e) -> e.getAge() > 35).forEach(System.out::println);//Stream.filter()过滤器
}