java8—lambda表达式(一)

<1.初识lambda表达式>

  需求1:获取当前公司中当前员工年龄大于35的员工信息

/**
 * 定义一个员工角色类
 */
@Data
@ToString
public class Employee{
   private String name;
   private int age;
   private double salary;
   public Employee(){}
   public Employee(String name,int age,double salary){
   this.name = name;
   this.age = age;
   this.salary = salary; 
}
} 
//引入junit Test测试工具类
import org.junit.Test
public class Test{
   //初始化员工信息
   List<Employee> emps = Arrays.asList(new Employee("Kiven",24,10000),new Employee("Nick",40,39999),new Employee("Lily",25,8000));
   @Test
   public void test1(){
   List<Employee> newEmps = filterEmployees(emps);
   for(Employee employee:newEmps){
   System.out.println(employee);
}
}
   private List<Employee> filterEmployees(List<Employee> emps){
   List<Employee> list = new ArrayList<>();
   for(Employee emp : list){
      if(emp.getAge()>35){
       list.add(emp);
}
    return list ;
}
}

需求2:获取当前公司中员工薪水大于5000的员工

//引入junit Test测试工具类
import org.junit.Test
public class Test{
   //初始化员工信息
   List<Employee> emps = Arrays.asList(new Employee("Kiven",24,10000),new Employee("Nick",40,39999),new Employee("Lily",25,8000));
   @Test
   public void test1(){
   List<Employee> newEmps = filterEmployees(emps);
   for(Employee employee:newEmps){
   System.out.println(employee);
}
}
   private List<Employee> filterEmployees(List<Employee> emps){
   List<Employee> list = new ArrayList<>();
   for(Employee emp : list){
      if(emp.getSalary()>5000){    //相比需求1的实现只改变了一行代码
       list.add(emp);
}
    return list;
}
}

优化方式1:策略模式,定义一系列算法,将每个算法单独封装,使之可以相互替换,具体方法策略的选择由客户端决定。

/**
 * 定义一个条件判断接口
 */
public interface MyPredicate<T>{
   boolean test(T t);
}
/**
 * 条件接口的具体实现-根据年龄过滤
 */
public class FilterEmployeeByAge{
  @Override 
  public boolean test(Employee e){
     return e.getAge >35;
}
}
/**
 * 条件接口的具体实现-根据薪水过滤
 */
public class FilterEmployeeBySalary{
  @Override 
  public boolean test(Employee e){
     return e.getSalary>5000;
}
}
//引入junit Test测试工具类
import org.junit.Test
public class Test{
   //初始化员工信息
   List<Employee> emps = Arrays.asList(new Employee("Kiven",24,10000),new Employee("Nick",40,39999),new Employee("Lily",25,8000));
   @Test
   public void test1(){
   List<Employee> newEmps = filterEmployees(emps,new FilterEmployeeByAge());  //适应各种判断条件,而不需要改变filterEmployees()方法,策略模式
   for(Employee employee:newEmps){
   System.out.println(employee);
}
}
   private List<Employee> filterEmployees(List<Employee> emps,MyPredicate<T> mp){ //新增一个MyPredicat类型的参数
   List<Employee> list = new ArrayList<>();
   for(Employee emp : list){
      if(mp.test(emp)){
       list.add(emp);
}
    return list;
}
}

优化方式2:匿名内部类,需要MyPredicate接口的具体实现,通过匿名内部类实现具体的操作

/**
 * 定义一个条件判断接口
 */
public interface MyPredicate<T>{
   boolean test(T t);
}定义一个条件判断接口
 */
public interface MyPredicate<T>{
   boolean test(T t);
}
//引入junit Test测试工具类
import org.junit.Test
public class Test{
   //初始化员工信息
   List<Employee> emps = Arrays.asList(new Employee("Kiven",24,10000),new Employee("Nick",40,39999),new Employee("Lily",25,8000));
   @Test
   public void test1(){
   List<Employee> list = filterEmployee(employees, new MyPredicate<Employee>() {  //匿名内部类
     @Override
     public boolean test(Employee employee) {
          return employee.getSalary() <= 5000;
     }
    });
    for (Employee employee : list) {
        System.out.println(employee);
     }
}
   private List<Employee> filterEmployees(List<Employee> emps,MyPredicate<T> mp){ //新增一个MyPredicat类型的参数
   List<Employee> list = new ArrayList<>();
   for(Employee emp : list){
      if(mp.test(emp)){
       list.add(emp);
}
    return list;
}
}

优化方式3:lambda表达式

/**
 * 定义一个条件判断接口
 */
public interface MyPredicate<T>{
   boolean test(T t);
}
//引入junit Test测试工具类
import org.junit.Test
public class Test{
   //初始化员工信息
   List<Employee> emps = Arrays.asList(new Employee("Kiven",24,10000),new Employee("Nick",40,39999),new Employee("Lily",25,8000));
   @Test
   public void test1(){
   List<Employee> list = filterEmployee(employees, employee -> employee.getSalary() >= 5000); //lambda表达式
   list.forEach(System.out::println);
}
}
   private List<Employee> filterEmployees(List<Employee> emps,MyPredicate<T> mp){ //新增一个MyPredicat类型的参数
   List<Employee> list = new ArrayList<>();
   for(Employee emp : list){
      if(mp.test(emp)){
       list.add(emp);
}
    return list;
}
}

优化方式4:streamApi

//引入junit Test测试工具类
import org.junit.Test
public class Test{
   public void test(){
   //streamApi 一步到位~
   emps.stream().filter(e->e.getSalary()>=5000).forEach(System.out::println);
}
}
}

<2.lambda表达式基础语法>:Java8中引入一个新的操作符 “->”,该操作符称为箭头操作符或lambda操作符

     箭头操作符将lambda表达式拆分成两部分:

            左侧:lambda表达式的参数列表

            右侧:lambda表达式所需要执行的功能,即lambda体

①语法格式1:无参数,无返回值

()->System.out.println("hello lambda!");

②语法格式2:有一个参数,无返回值 

Consumer c = x -> System.out.println(x);
c.accept("hello");

③语法格式3:有两个以上的的参数,并且lambda体中有多条语句

Comparator<Integer> com = (x,y) -> {
   System.out.println("函数式接口");
   return Integer.compare(x,y);
};
System.out.println(com.compare(2,2));

备注:

*左侧若只有一个参数,小括号可以不写

*若lambda体中只有一条语句,return 和 大括号都可以不写

*lambda表达式参数列表的参数类型省略不写,JVM编译器可以通过上下文推断出类型,即“类型推断”

   

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值