登录/注册
唐某
11055
占位
7
占位
31
浏览量
占位
粉丝
占位
关注
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
@Test
public 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体只有一条语句,有

暂无评论