エンジニアの将来って?

現在10年目エンジニアがプログラムの解説、ゲームの研究を書く雑記ブログです

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

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

スポンサーリンク

 

前提条件:eclipseの環境

この記事では、eclipseのバージョンは

バージョン Eclipse4.7 Oxygen

を使っています。
インストールの仕方は、下の記事をご参考ください。

www.tairax.com

eclipseでのJavaプロジェクト作成方法は、以下の記事をご参考ください。

www.tairax.com

eclipseでのJavaファイル作成方法は、以下の記事をご参考ください。

www.tairax.com

flatMapメソッドとは

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

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

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

フォルダ構成

f:id:Tairax:20170914130802p:plain

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

解説で使うJavaプログラム

Javaプログラムを2つ使います。
その内容は

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

実行結果

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

無事リストのリストを表示できました。
ラムダ式の注意点として

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メソッドの解説でした。
この記事が皆さんのご参考になれば幸いです。

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

 

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

【Java8】mapToObjメソッドを使ってFizzBuzz問題【ラムダ式】

【Java8】filterメソッドを解説【ラムダ式】

 

今までブログで書いたJavaの解説記事のまとめは、こちらをご参考ください。

【Java】ブログで書いた文法記事のまとめ