エンジニアの将来って?

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

【Java8】flatMapメソッドでリストのリストを表示【ラムダ式】

こんにちは。たいら(@tairaengineer2)です。
今回の記事はJava8で追加されたラムダ式の中の1つのflatMapメソッドについてのアウトプット記事です。

今回作ったのは、リストのprivate変数を持っている国の名前を格納するクラスのオブジェクトを生成し、オブジェクトをリストで持ってflatMapメソッドで表示させるプログラムです。

flatMapメソッドとは

このストリームの各要素をマップされたストリーム(指定されたマッピング関数を各要素に適用することで得られる)の内容で置き換えた結果から成るストリームを返します。
各マップ先ストリームは、その内容がこのストリーム内に配置されるとクローズされます。(マップ先ストリームがnullの場合はかわりに空のストリームが使用されます。)
これは中間操作です。

Stream (Java Platform SE 8)から引用させて頂きました

つまり、ストリーム引数にとり、何らかの処理をしてストリームを返すのがflatMapメソッドです。
それでは、早速flatMapメソッドを使ってみましょう!

フォルダ構成

f:id:Tairax:20170914130802p:plain

フォルダ構成はこのように同じフォルダにプログラムを格納しています。

Javaプログラム

国の名前を格納するクラスがCountryクラス、そのCountryクラスを用いて画面表示するのがFlatMapPracticeクラスです。

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);
    }
}

FlatMapPracticeクラス

package lambda;

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

/**
 * flatMapメソッドを練習するクラス
 *
 */
public class FlatMapPractice {
	/**
	 * メインメソッド
	 * @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));
	}
}

実行結果

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

無事リストのリストを表示できました。
FlatMapPracticeクラス書いていて初めて知ったんですが、
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 を解決できません

って怒られます(;・д・)
ラムダ式では引数に要注意ですね。

まとめ

flatMapメソッドの仕様について少しは理解が深まったかなと思います。。
いかがだったでしょうか?
この記事が皆さんのご参考になれば幸いです。

ではでは~(・ω・)ノシ

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

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

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

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

ほかにも勉強記事を書いてます。
よければご参考ください。

今までブログで書いたJavaのアウトプット記事のまとめ

私が基本情報処理試験に合格したときの勉強方法をご紹介します!

JavaScriptの正規表現で色々判定