Lambda式--コードをより簡潔にする
Lambda式は,機能関数をメソッドのパラメータ(動作パラメータ,メソッドへの参照と見なすことができる)として,単一メソッドのインタフェースをより簡潔に実現することができる.
次に例を挙げる
Employee.java
8000元以上の報酬を受け取る従業員のリストでは、まず次のような方法を定義することを考えます.
必要に応じて変更し、営業部門の下にあるすべての従業員のリストを取得するには、次の方法を追加する必要があります.
この方法は上の方法とif判断文の違いだけです.同様の要件をいくつか追加する場合は、貼り付けコードをコピーする必要があります.これはコードのメンテナンスに不利です.この場合,設計モードにおけるポリシーモード最適化コードを用いることが考えられる.
ポリシーモードを運用すると、ソフトウェア設計の開閉原則に合致するが、ポリシーを追加するたびに、このポリシーを実現するためのインタフェースを新しいクラスに追加しなければならないが、インタフェース実装クラスの具体的な方法だけが必要である.すなわち、実装方法は、filterEmptyListメソッドにパラメータとして渡すためにクラスにカプセル化されなければならない.匿名クラスを使用することができますが、匿名クラスを使用するコードの可読性も相対的に悪いです.
Java 8ではメソッドパラメータとして関数を利用できるという特性を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);