今回も前回同様、従来の書き方からストリームに変換していく過程を紹介していきます。

 前回は主にfilterメソッド、mapメソッド、forEachメソッド、collectメソッドの4種類のメソッドを使用しましたが、今回はそれに加えflatMapメソッドを使っていきます。

 また、collectメソッドで、標準では提供されていない機能を独自のCollectorインタフェースの実装クラスを作成してみます。

サンプルのプロジェクト (こちらからダウンロードできます)
LambdaStreamDemo2.zip

 今回も、前回同様、顧客を表すCustomerクラスを使用しましょう。Customerクラスは名前、取引額、グレードを保持するクラスです。それぞれgetNameメソッド、getTransactionValueメソッド、getGradeメソッドで取得できます。

 今回はCustomerクラスに加えて、営業担当者を表すSalesPersonクラスをします。SalesPersonクラスは名前、担当エリア、担当顧客を保持しているとします。リスト1にSalesPersonクラスを示しました。

 

リスト1 SalesPersonクラス

public class SalesPerson {
    // 名前
    private String name;
    // 担当エリア
    private String area;
    // 担当顧客
    private List<Customer> customers;
    
    public SalesPerson(String name, String area, Customer... initialCustomer) {
        this.name = name;
        this.area = area;
        
        customers = new ArrayList<>();
        Collections.addAll(customers, initialCustomer);
    }

    public String getName() {
        return name;
    }

    public String getArea() {
        return area;
    }

    public List<Customer> getCustomers() {
        return customers;
    }
    
    public String toString() {
        return new StringJoiner(", ", "[", "]").add(name).add(area).add(customers.toString()).toString();
    }
}