【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メソッドのさまざまな使い方を初心者向けにわかりやすく解説します!

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メソッドに出てくる「->」はラムダ式の文法です。ラムダ式についての詳細を確認したいときはこちらの記事を確認してください。

【Java入門】Java8のラムダ式の使い方とメリットとは(Stream API)
更新日 : 2018年10月29日

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の要素を表示することができました!メソッド参照の詳細についてはこちらの記事で解説しているので、ぜひ確認してください!

【楽チンJava】メソッド参照での呼び出し方
更新日 : 2017年7月27日

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

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

Java8の新機能を徹底解説!(ラムダ式、Streamなど)
更新日 : 2017年12月20日

for文の使い方総まとめ

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

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

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

【Java入門】拡張for文とJava8のforEachの使い方総まとめ
更新日 : 2019年6月6日

まとめ

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

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

LINEで送る
Pocket

SEからWebエンジニアへ転職した理由

侍エンジニア塾卒業生の小池さんは、以前は社内SEとして約5年ほど勤務していました。しかし業務内容は社内のヘルプデスク対応など、プログラムを書く仕事は全くなかったそうです。

SEながらプログラムを書けない現状に「将来仕事がなくなるんじゃないか」と不安を感じ、プログラミング学習を決意。

弊社スクールで学習し、無事ベンチャー企業のプログラマーとして転職に成功しました。そんな小池さんの学習法や転職体験談を伺いましたので、是非ご覧ください。

「プログラミングができないSEは仕事がなくなる」不安を感じたSEが未経験から転職成功するまで
更新日 : 2019年10月7日

書いた人

中沢 丈

中沢 丈

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

連絡先はこちらです。
[email protected]

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説