Lambda和Stream是Jdk1.8中引入的两个重要特性,大家都知道Lambda是函数式编程,可以将方法像参数一样传递,那么什么是Lambda表达式呢,我们一起来看一下。
首先我们定义一个员工类Employee,他含有三个字段name,age和salary。代码如下
public class Employee {
private String name;
private int age;
private double salary;
public Employee(String name, int age, double salary) {
super();
this.name = name;
this.age = age;
this.salary = salary;
}
}
public List filterEmployees(List list) {
List emps = new ArrayList<>();
for (Employee emp : list) {
if (emp.getAge() >= 25) {
emps.add(emp);
}
}
return emps;
}
public List filterEmployees2(List list) {
List emps = new ArrayList<>();
for (Employee emp : list) {
if (emp.getSalary() >= 5000) {
emps.add(emp);
}
}
return emps;
}
可以看到,有大段的代码重复,只有中间改了一句话是有效的,那么我们要如何改进呢? 我们定义一个范型接口MyPredicate
public interface MyPredicate {
public boolean test(T t);
}
我们可以使用策略模式,将它作为一个参数传入类似于Comparator接口。
public List filterEmployee(List list, MyPredicate mp) {
List emps = new ArrayList<>();
for (Employee employee : list) {
if (mp.test(employee)) {
emps.add(employee);
}
}
return emps;
}
public class FilterEmployeeByAge implements MyPredicate{
@Override
public boolean test(Employee t) {
return t.getAge()>=25;
}
}
public class FilterEmployeeBySalary implements MyPredicate{
@Override
public boolean test(Employee t) {
return t.getSalary()>=10000;
}
}
然后将实现类传递给策略函数即可:
List list= filterEmployee(employees, new FilterEmployeeByAge());
List list2 = filterEmployee(employees, new FilterEmployeeBySalary());
public void test() {
List list = filterEmployee(employees, new MyPredicate() {
@Override
public boolean test(Employee t) {
// TODO Auto-generated method stub
return t.getSalary() <= 50000;
}
});
for (Employee employee : list) {
System.out.println(employee);
}
}
public void test() {
List list = filterEmployee(employees, (e) -> e.getSalary() <= 5000);
list.forEach(System.out::println);
}
我们来看一下Lambda表达式的基础语法:Java8中引入了一个新的操作符:"->"该操作符称为箭头操作符或Lambda操作符
箭头操作符将Lambda表达式拆分为两部分:
左侧为Lambda表达式的参数列表
右侧为Lambda表达式所需执行的功能,即Lambda体
Lambda是对接口的实现,试想如果有多个具有相同参数的接口我们知道要实现哪一个么?所以我们需要函数式接口——只有一个函数的接口
Lambda语法规则:
语法格式一:无参数,无返回值
Runnable r = () -> System.out.println("Hello world"+num);
r.run();
Consumer con=x -> System.out.println(x);
con.accept("lemon go!");
Comparator com=(x,y)->{
System.out.println("函数式接口");
return Integer.compare(x, y);
};
Comparator com1=(Integer x,Integer y)->Integer.compare(x, y);
(Integer x,Integer y)->Integer.compare(x, y);
函数式接口就是接口中只有一个抽象方法的接口,称为函数式接口。可以使用注解@FunctionalInterface修饰可以检查是否是函数式接口