Lambda式--コードをより簡潔にする


Lambda式は,機能関数をメソッドのパラメータ(動作パラメータ,メソッドへの参照と見なすことができる)として,単一メソッドのインタフェースをより簡潔に実現することができる.
次に例を挙げる
Employee.java
public class Employee {
    private String name;
    private String aprtName;
    private double salary;

    public Employee(String name, String aprtName, double salary) {
        this.name = name;
        this.aprtName = aprtName;
        this.salary = salary;
    }
    @Override
    public String toString() {
        return "Employee [name=" + name + ", aprtName=" + aprtName + ", salary=" + salary + "]";
    }
}

8000元以上の報酬を受け取る従業員のリストでは、まず次のような方法を定義することを考えます.
    public static List getHighSalaryEmp(List emps) {
        List employeeList = new ArrayList();
        for(Employee employee : emps) {
            if(employee.getSalary() >= 8000) {
                employeeList.add(employee);
            }
        }
        return employeeList;
    }

必要に応じて変更し、営業部門の下にあるすべての従業員のリストを取得するには、次の方法を追加する必要があります.
    public static List getSalEmp(List emps) {
        List employeeList = new ArrayList();
        for(Employee employee : emps) {
            if (employee.getAprtName().equals("   ")){
                employeeList.add(employee);
            }
        }
        return employeeList;
    }

この方法は上の方法とif判断文の違いだけです.同様の要件をいくつか追加する場合は、貼り付けコードをコピーする必要があります.これはコードのメンテナンスに不利です.この場合,設計モードにおけるポリシーモード最適化コードを用いることが考えられる.
public interface EmpStrategy {
    boolean condition(Employee employee);
}

public class HighSalaryEmpStrategy implements EmpStrategy {

    @Override
    public boolean condition(Employee employee) {
        if(employee.getSalary() >= 8000) return true;
        return false;
    }

}
    public static List filterEmpList(List emps,EmpStrategy strategy){
        List employees = new ArrayList<>();
        for(Employee employee : emps) {
            if(strategy.condition(employee)) {
                employees.add(employee);
            }
        }
        return employees;
    }

ポリシーモードを運用すると、ソフトウェア設計の開閉原則に合致するが、ポリシーを追加するたびに、このポリシーを実現するためのインタフェースを新しいクラスに追加しなければならないが、インタフェース実装クラスの具体的な方法だけが必要である.すなわち、実装方法は、filterEmptyListメソッドにパラメータとして渡すためにクラスにカプセル化されなければならない.匿名クラスを使用することができますが、匿名クラスを使用するコードの可読性も相対的に悪いです.
Java 8ではメソッドパラメータとして関数を利用できるという特性をLambda式と組み合わせることで,コードの簡略化を図ることができる.
filterEmpList(employees, (Employee employee) ->  employee.getSalary() >= 8000).forEach(System.out::println);