エンジニアの将来って?

現在6年目の元COBOL現Javaエンジニアが、将来への考えや勉強のアウトプット、たまに腎臓について書くブログです

Java8のflatMapメソッドを使ってみる

こんにちは、たいらです。
今回の記事はJava8で追加されたラムダ式についてのアウトプットです。
ラムダ式のflatMapメソッドを使ってプログラムを作りました。
今回作ったのは、リストのprivate変数を持っている国の名前を格納するクラスのオブジェクトを生成し、オブジェクトをリストで持ってflatMapメソッドで表示させるプログラムです。

フォルダ構成

f:id:Tairax:20170914130802p:plain

 

Java

Countryクラス

package lambda;

import java.util.ArrayList;
import java.util.List;

/**
 * 国の名前を格納するクラス
 *
 */
public class Country {
/** 国の名前リスト */
    private List<String> countryList = new ArrayList<>();

/**
* 国の名前リストを取得するメソッド
* @return 国の名前リスト
*/
    public List<String> getCountryList() {
        return countryList;
    }

/**
* 国の名前リストを設定するメソッド
* @param countryList
*/
    public void setCountryList(List<String> countryList) {
        this.countryList = countryList;
    }

/**
* 国の名前を追加するメソッド
* @param country
*/
    public void addCountryList(String country) {
        this.countryList.add(country);
    }
}

FlatMapTestクラス

package lambda;

import java.util.ArrayList;
import java.util.List;

/**
 * flatMapメソッドを練習するクラス
 *
 */
public class FlatMapTest {
    /**
     * メインメソッド
     * @param args
     */
    public static void main(String[] args) {
// クラスCountryに設定する1つ目のListを生成し、設定
        Country country = new Country();
        List<String> countryList1 = new ArrayList<>();
        countryList1.add("日本");
        countryList1.add("アメリカ");
        countryList1.add("ドイツ");
        countryList1.add("イギリス");
        country.setCountryList(countryList1);

 

// クラスCountryに設定する2つ目のListを生成し、設定
        Country country2 = new Country();
        country2.addCountryList("イタリア");
        country2.addCountryList("カナダ");
        country2.addCountryList("フランス");
        country2.addCountryList("オーストラリア");

 

// クラスCountryのリストを生成し、上記で生成したものを追加
        List<Country> countries = new ArrayList<>();
        countries.add(country);
        countries.add(country2);

 

// クラスCountryのリストの中身を取得し、出力
        countries.stream().flatMap(c -> c.getCountryList().stream())
            .forEach(c -> System.out.println(c));
    }
}

実行結果

日本
アメリカ
ドイツ
イギリス
イタリア
カナダ
フランス
オーストラリア

 

無事リストのリストを表示できました(*´∀`*)
FlatMapTestクラス書いていて初めて知ったんですが、
countries.stream().flatMap(c -> c.getCountryList().stream())
のパラメータ名cをすでに宣言しているローカル変数と同じ(例えばcountryとか)にすると

この行に複数マーカーがありますこの行に複数マーカーがあります
- Lambda expression's parameter country cannot redeclare another local variable defined in an enclosing  scope.
- c を解決できません

 

って怒られました(;・д・)
日々勉強です。

 

参考にさせて頂いたサイト様

Java8のStream APIの使い方(中間操作編② - flatMap, distinct, limit, skip) - TASK NOTES

Java 8はラムダ式でここまで変わる(4):Stream APIの主なメソッドと処理結果のOptionalクラスの使い方 (1/4) - @IT

Java8 Stream APIの基本(1) - 代表的な中間操作 - エンタープライズギークス (Enterprise Geeks)