您的位置:首页 > 编程语言 > Java开发

java8,用lambda实现策略模式

2015-11-17 17:18 351 查看

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

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

我们先写一个员工类,

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();
}

}

 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: