Java8新特性学习
唐某 2021-05-08 09:49:45 2021-05-08 60 0
1.主要内容
1.Lambda表达式 2. 函数式接口 3. 方法引用于构造器引用 4. Stream API 5. 接口中的默认方法与静态方法 6. 新时间日期API 7. 重复注解
入门案例:根据条件获取员工信息
//员工表public class Employee { private String name; private int age; private double salary; ....}//员工信息List<Employee> emplpyees = Arrays.asList( new Employee("张三", 14, 5444.42), new Employee("李四", 39, 3434.15), new Employee("王五", 31, 5425.55), new Employee("赵六", 11, 2544.42), new Employee("陈七", 98, 944.42));1.传统方式 @Test public void test3() { List<Employee> emps = filterEmployees(emplpyees); System.out.println(emps); } // 获取当前员工中年龄大于35的员工 public List<Employee> filterEmployees(List<Employee> list) { List<Employee> emps = new ArrayList<>(); for (Employee emp : list) { if (emp.getAge() >= 35) { emps.add(emp); } } return emps; }
如果条件改变呢?比如,改成想要工资大于5000的员工信息.传统方式,拷贝代码,修改if代码
优化方式一:设计模式,策略设计模式定义一个借口,根据条件创建实现类//定义一个接口public interface MyProdicate<T> { public boolean test(T t);}//实现类,public class FilterEmployeeByAge implements MyProdicate<Employee>{ @Override public boolean test(Employee t) { return t.getAge()>=35; }}//判断public List<Employee> filterEmployees(List<Employee> list, MyProdicate<Employee> mp) { List<Employee> emps = new ArrayList<>(); for (Employee emp : list) { if (mp.test(emp)) { emps.add(emp); } } return emps;}//测试@Test public void test4() { List<Employee> emps = filterEmployees(emplpyees, new FilterEmployeeByAge()); System.out.println(emps); }
不过,这种方式中,每加一个条件,就要加一个实现类,不好,在此基础上进行优化
匿名内部类// 优化方式二,匿名内部类 public void test5() { List<Employee> emps = filterEmployees(emplpyees, new MyProdicate<Employee>() { @Override public boolean test(Employee t) { return t.getSalary() >= 5000; } }); System.out.println(emps); }
匿名内部类每次使用,还是要写多余代码,可以继续优化
lambda表达式// 优化方式三:lambda] @Test public void test6() { List<Employee> emps = filterEmployees(emplpyees, (e) -> e.getSalary() < 5000); emps.forEach(System.out::println); }
如果没有接口.怎么优化Stream API
// 优化方式四,只有emplpyees,Stream API@Testpublic void test7() { emplpyees.stream().filter((e) -> e.getSalary() < 5000).forEach(System.out::println);}
2.Lambda表达式
1.匿名函数
Lambda是一个匿名函数,可以理解为一段可以传递的代码(将代码像数据一样传递); 可以写出更简洁、更灵活的代码; 作为一种更紧凑的代码风格,是Java语言表达能力得到提升。
2.语法格式
1.lambda表达式的基础语法
java8中引入新的操作符"->",箭头操作符/lambda操作符 箭头操作符将lambda 表达式拆分成两部分: 左侧:lambda的参数列表 右侧:lambda中所需要执行的功能,即lambda体
```
• 语法格式1:无参数,无返回值 :()->具体功能• 语法格式2:有一个参数,无返回值:(x)->具体功能• 语法格式3:若只有一个参数,参数小括号可以省略不写:x->具体功能• 语法格式4:有两个以上的参数,lambda体中有多条语句,有返回值:• 语法格式5:有两个参数,lambda体只有一条语句,有