【Java入門】Java8のforEachとラムダ式を配列、List、Mapで使う

こんにちは!エンジニアの中沢です。

Javaにはループ処理を行うfor文や拡張for文(for-each文)がありますが、Java8でさらに便利なforEachメソッドが追加されました。

この記事では、

  • forEachメソッドとは
  • forEachメソッドと拡張for文(for-each文)の違い
  • forEachメソッドを配列、List、Mapで使う方法
  • forEachメソッドでインデックス番号を取得する方法
  • メソッド参照を使ってさらに省略する方法
  • Java8のラムダ式やStream APIとは

などの基本的な内容から、応用的な内容についても解説していきます。今回はこれらの方法を覚えるために、forEachメソッドのさまざまな使い方を初心者向けにわかりやすく解説します!

なお、Javaの記事については、こちらにまとめています。

目次

forEachメソッドとは

初めにforEachメソッドについて解説します。Javaのループ処理にはfor文、拡張for文(for-each文)などがありましたが、Java8でforEachメソッドが追加されました。forEachメソッドはfor文と同様に配列、List、Mapなどに対して繰り返し処理を行うときに使います。

forEachメソッドは拡張for文(for-each文)よりもさらに簡潔にコードを書けるので、ぜひ覚えてください!

拡張for文(for-each文)との違いを比較

ここでは拡張for文(for-each文)とforEachメソッドの違いを解説します。同じ動作をする拡張for文とforEachメソッドを比較して文法を確認してみましょう。

// 拡張for文(for-each文)の文法
for (データ型 引数 : コレクション名(Listなどの変数名)) {
    繰り返し行う処理(引数);
}

// 拡張for文(for-each文)のコードの記述例
for (String s : list) {
    System.out.println(s);
}
// forEachメソッドの文法
コレクション名(Listなどの変数名).forEach(引数 -> 繰り返し行う処理(引数))

// forEachメソッドのコードの記述例
list.forEach(s -> System.out.println(s))

forEachメソッドはラムダ式と合わせて使うのでラムダ式の使い方を覚える必要がありますが、単純なループ処理ならここで解説したコードを覚えておけば大丈夫です。

forEachメソッドとラムダ式を使った場合は、型を書く必要がなくなるので簡潔にコードを書くことができます。forEachメソッドに出てくる「->」はラムダ式の文法です。ラムダ式についての詳細を確認したいときはこちらの記事を確認してください。

forEachメソッドの使い方

ListでforEachメソッドを使う方法

ここではListのループ処理でforEachメソッドを使う方法を解説します。Listのすべての要素を取得する方法を、拡張for文とforEachメソッドを比較したサンプルコードで確認してみましょう。

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

public class Main {

    public static void main(String[] args) {

        List<String> list = new ArrayList<>();
        list.add("サ");
        list.add("ム");
        list.add("ラ");
        list.add("イ");

        // 拡張for文
        System.out.println("拡張for文の場合");
        for (String s : list) {
            System.out.println(s);
        }

        // forEachメソッド
        System.out.println("forEachメソッドの場合");
        list.forEach(s -> System.out.println(s));
    }
}

[実行結果]

拡張for文の場合
サ
ム
ラ
イ
forEachメソッドの場合
サ
ム
ラ
イ

forEachメソッドを使って、拡張for文と同じようにListのすべての要素を表示することができました!

配列でforEachメソッドを使う方法

ここでは配列でforEachメソッドを使う方法を解説します。配列でforEachメソッドを使う場合は”Stream API”を使う必要があります。“Stream API”を使うには次のように記述します。

Arrays.stream(配列の変数名).forEach(引数 -> 繰り返し行う処理(引数));

forEachメソッドで配列のすべての要素を表示する方法を次のサンプルコードで確認してみましょう。

import java.util.Arrays;

public class Main {

    public static void main(String[] args) {

        String[] strArray = { "サ", "ム", "ラ", "イ" };
        Arrays.stream(strArray).forEach(s -> System.out.println(s));
    }
}

[実行結果]

サ
ム
ラ
イ

forEachメソッドと”Stream API”で配列のすべての要素を表示することができました!

MapでforEachメソッドを使う方法

ここではMapのキー(key)と値(value)をforEachメソッドで取得する方法を解説します。forEachメソッドを使えばMapのループ処理も簡単に行えます。forEachメソッドでMapのキー(key)と値(value)を表示する方法を次のサンプルコードで確認してみましょう。

import java.util.HashMap;
import java.util.Map;

public class Main {

    public static void main(String[] args) {

        Map<String, String> map = new HashMap<>();
        map.put("samurai", "サムライ");
        map.put("engineer", "エンジニア");
        map.put("juku", "塾");

        map.forEach((key, value) -> System.out.println(key + " : " + value));
    }
}

[実行結果]

juku : 塾
samurai : サムライ
engineer : エンジニア

forEachメソッドでMapのキー(key)と値(value)を表示することができました!このサンプルコードのように、MapでforEachを使う場合は、第1引数がキー(key)、第2引数が値(value)になります。注意点として、ここではHashMapを使っているためキー(key)の順番は保持されていません。

インデックス番号を取得する方法

forEachメソッドではループカウンタがないため、for文のようにインデックス番号を取得することができません。そのため、indexOfメソッドを使って要素のインデックス番号を取得する方法とループカウンタとして使う変数をループの外に用意して対応する方法を解説します。

indexOfメソッドを使う方法

ここではindexOfメソッドを使って要素のインデックス番号を取得する方法を解説します。indexOfメソッドは引数の値と同じ要素のインデックス番号を返すので、これを使ってインデックス番号を取得することができます。

ただし、indexOfメソッドでは同じ要素が複数含まれる場合は初めのインデックス番号が表示されるので注意してください。次のサンプルコードでindexOfメソッドを使う方法を確認してみましょう。

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

public class Main {

    public static void main(String[] args) {

        List<String> list = new ArrayList<>();
        list.add("サ");
        list.add("ム");
        list.add("ラ");
        list.add("イ");

        list.forEach(s -> System.out.println(list.indexOf(s) + " : " + s));
    }
}

[実行結果]

0 : サ
1 : ム
2 : ラ
3 : イ

indexOfメソッドを使ってインデックス番号と要素を取得することができました!

ループカウンタとして使う変数をループの外に用意する

ここではループカウンタとして使う変数をループの外に用意する方法を解説します。ラムダ式のループの中からは、外側で宣言した変数に値に代入することができませんが、配列にした場合は値を変更することができます。

次のサンプルコードでループカウンタとして使う変数をループの外に用意する方法を確認してみましょう。

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

public class Main {

    public static void main(String[] args) {

        List<String> list = new ArrayList<>();
        list.add("サ");
        list.add("ム");
        list.add("ラ");
        list.add("イ");

        int[] i = { 0 };
        list.forEach(s -> {
            System.out.println(i[0] + " : " + s);
            i[0]++;
        });
    }
}

[実行結果]

0 : サ
1 : ム
2 : ラ
3 : イ

ループカウンタとして使う変数をループの外に用意して、インデックス番号と要素を取得することができました!

メソッド参照を使ってラムダ式を省略する方法

ここではメソッド参照を使ってラムダ式を省略する方法を解説します。メソッド参照はラムダ式と同様に、Java8で追加された機能です。次のサンプルコードでメソッド参照を使ってラムダ式を省略する方法を確認してみましょう。

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

public class Main {

    public static void main(String[] args) {

        List<String> list = new ArrayList<>();
        list.add("サ");
        list.add("ム");
        list.add("ラ");
        list.add("イ");

        list.forEach(System.out::println);
    }
}

[実行結果]

サ
ム
ラ
イ

今までに解説したforEachメソッドとラムダ式を使った方法と同じように、メソッド参照を使ってListの要素を表示することができました!メソッド参照の詳細についてはこちらの記事で解説しているので、ぜひ確認してください!

Java8のラムダ式やStream APIについての解説

Java8で追加されたラムダ式やstream APIについて詳しく知りたいときはこちらの記事を確認してください!

for文の使い方総まとめ

for文の使い方について詳しく知りたいときはこちらの記事を確認してください!

拡張for文(for-each文)の使い方総まとめ

拡張for文(for-each文)の使い方について詳しく知りたいときはこちらの記事を確認してください!

まとめ

いかがでしたか?今回はJava8で追加されたforEachメソッドの使い方について解説しました。forEachメソッドは拡張for文よりも簡潔にコードを書けるのでぜひ活用してくださいね。

もしforEachメソッドの使い方を忘れてしまったらこの記事を確認してください!

この記事を書いた人

フリーランスエンジニア。
システム開発からコンテンツ作成まで幅広く対応します。

連絡先はこちらです。
ntakeshi@sejuku.net

目次