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(); } }
相关文章推荐
- java8——使用lambda和枚举实现简洁、可读性良好的策略模式
- java 策略模式,list集合,实现id 姓名年龄正序倒序排序(如果年龄或者姓名重复,按id正序排序)
- 策略模式的java样例实现(以鸭子为例)
- Java策略模式的简单应用实现方法
- Java 实现策略(Strategy)模式
- 策略模式Java实现
- java实现策略模式
- 策略模式 java实现
- Java 实现策略(Strategy)模式
- Java8 in action(1) 通过行为参数化传递代码--lambda代替策略模式
- 设计模式:策略模式的实现 c++ 与 java
- 设计模式之第8章-策略模式(Java实现)
- 设计模式学习笔记之策略模式(Java实现)
- 六种常用的设计模式java实现(六)策略模式
- Java记录 -68- Java实现策略模式
- Java 实现策略模式
- 策略模式(使用Java实现)
- 《大话设计模式》读书笔记:策略模式+反射的Java实现
- 大话设计模式2 策略模式 的java代码实现
- Java记录 -68- Java实现策略模式