java8,用lambda实现策略模式

本文介绍了如何使用Java8的Lambda表达式来实现策略模式。通过一个例子展示了在公司员工计算平均年龄和平均工资场景中,利用Lambda简化策略模式的实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先写一个策略模式的经典应用:

一个公司有很多员工,计算所有员工的平均年龄和平均工资。

我们先写一个员工类,

public class Employee {
   public Employee(Sex sex, int salary){
      this.sex = sex;
      this.salary = salary;
   }
   private Sex sex;
   private int salary;
   public int getSalary() {
      return salary;
   }
   public void setSalary(int salary) {
      this.salary = salary;
   }
   public Sex getSex() {
      return sex;
   }
   public void setSex(Sex sex) {
      this.sex = sex;
   }
}

enum Sex{
   MALE,
   FEMALE
}

 

 

再来写一个calculator接口和两个实现类:

public interface ICalculator {
   public double calAverageSalary(List<Employee> employees);
}


class MaleEmployeeCalculator implements ICalculator{
   @Override
   public double calAverageSalary(List<Employee> employees) {
      return employees.stream().filter(t -> t.getSex() == Sex.FEMALE).mapToInt(Employee::getSalary).average().getAsDouble();
   }
   
}

class FemaleEmployeeCalculator implements ICalculator{
   @Override
   public double calAverageSalary(List<Employee> employees) {
      return employees.stream().filter(t -> t.getSex() == Sex.FEMALE).mapToInt(Employee::getSalary).average().getAsDouble();
   }
   
}

 

 客户端代码:

public class Client {

   public static void main(String[] args) {
      List<Employee> employeeList = new ArrayList();
      employeeList.add(new Employee(Sex.MALE, 8000));
      employeeList.add(new Employee(Sex.MALE, 9000));
      employeeList.add(new Employee(Sex.MALE, 10000));
      employeeList.add(new Employee(Sex.MALE, 7000));
      employeeList.add(new Employee(Sex.FEMALE, 8000));
      employeeList.add(new Employee(Sex.FEMALE, 8000));
      employeeList.add(new Employee(Sex.FEMALE, 9000));
      employeeList.add(new Employee(Sex.FEMALE, 10000));
      
      ICalculator maleEmployeeCalculator = new MaleEmployeeCalculator();
      double mAverageSalary = maleEmployeeCalculator.calAverageSalary(employeeList);
      System.out.println("Male employees average salary is: " + mAverageSalary);
      
      ICalculator femaleEmployeeCalculator = new FemaleEmployeeCalculator();
      double fmAverageSalary = femaleEmployeeCalculator.calAverageSalary(employeeList);
      System.out.println("Female employees average salary is: " + fmAverageSalary);
   }

}

 

 

 

 

 下面用lambda来实现策略模式:

 

Employee类不变,无需使用ICalculator接口

 

客户端代码

public class LambdaTestClient {

   public static void main(String[] args) {
      List<Employee> employeeList = new ArrayList();
      employeeList.add(new Employee(Sex.MALE, 8000));
      employeeList.add(new Employee(Sex.MALE, 9000));
      employeeList.add(new Employee(Sex.MALE, 10000));
      employeeList.add(new Employee(Sex.MALE, 7000));
      employeeList.add(new Employee(Sex.FEMALE, 8000));
      employeeList.add(new Employee(Sex.FEMALE, 8000));
      employeeList.add(new Employee(Sex.FEMALE, 9000));
      employeeList.add(new Employee(Sex.FEMALE, 10000));
      

      double mAverageSalary = calAverageSalary(employeeList,t->t.getSex() == Sex.MALE);
      System.out.println("Male employees average salary is: " + mAverageSalary);
      
      double fmAverageSalary = calAverageSalary(employeeList,t->t.getSex() == Sex.FEMALE);
      System.out.println("Female employees average salary is: " + fmAverageSalary);
   }
   
   static double calAverageSalary(List<Employee> employees, Predicate<Employee> p){
      return employees.stream().filter(p).mapToInt(Employee::getSalary).average().getAsDouble();
   }

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值