この記事では、Listのforループを行うさまざまな方法を紹介する。
今回利用するサンプルデータ
String型のリストを、今回のサンプルデータとして利用する。
final List<String> fruits = List.of("apple", "banana", "orange");
ログなどを出力して終了するパターン(データを何も生成しない)
①基本的なfor文
fruits.size()
からリストの長さ「3」を取得できるので、
i=0,1,2と3回ループする基本的な構文。
for(int i = 0; i < fruits.size(); i++) {
System.out.println(fruits.get(i));
}
②拡張for文
このように書くと、fruitsの要素数分だけ自動で処理が実行される。
for (String fruit: fruits) {
System.out.println(fruit);
}
③forEach文
fruits.forEach(fruit -> {
System.out.println(fruit);
});
リストA→リストBに変換するパターン
今回は
- リストA:
List<String>
型のフルーツ名リスト - リストB:
List<Integer>
型のフルーツ名のそれぞれの文字列長
という変換を行う。
①基本的なfor文
// 最初に空のリストを用意
final List<Integer> fruitWordLength = new ArrayList<>();
for (int i = 0; i < fruits.size(); i++) {
final Integer wordLength = fruits.get(i).length();
// 空の配列に追加する
fruitWordLength.add(wordLength);
}
②拡張for文
// 最初に空のリストを用意
final List<Integer> fruitWordLength = new ArrayList<>();
for (String fruit : fruits) {
final Integer wordLength = fruit.length();
// 空の配列に追加する
fruitWordLength.add(wordLength);
}
③stream処理を利用
// 例1
final List<Integer> fruitWordLength = fruits.stream()
.map(fruit -> {
// mapの中には、1:1変換する処理を書く
// fruit→fruit.length()に変換している
return fruit.length();
})
.collect(Collectors.toList()); // collectを使って、stream処理した全てのデータをリストとしてまとめる
// 例2 こちらは同じ処理の省略形
final List<Integer> fruitWordLength = fruits.stream()
.map(fruit -> fruit.length()) // 一行でreturnしている関数であればこのように省略できる
.collect(Collectors.toList());
ちなみに筆者のおすすめはこのパターン。
Collectors.toUnmodifiableList()
を利用すると、追加や削除ができないリストを生成することができるので
誤って他の処理で追加や削除が勝手にされる可能性がなくなる。
final List<Integer> fruitWordLength = fruits.stream()
.map(fruit -> fruit.length())
.collect(Collectors.toUnmodifiableList());
// この場合、後から以下のような操作ができない
fruitWordLength.add(1);
結局どれを使えば良いか?
慣れていればstream処理やforEach文などの③のパターンを利用することをおすすめする。
①の書き方の特徴
- 他のプログラミング言語でも同じような書き方ができるので覚えやすい
- インデックスの値(リストの番号)をfor文で利用したい場合は使いやすい
- 「i」の初期値や終了条件を間違えるとバグに繋がる
②の書き方の特徴
- 「i」の値などのインデックスを考えずに済む
- 一番簡潔にコードを書くことができる
③の書き方の特徴
- 別のリストを結果として生成したい場合は一番適している
処理結果をそのまま一気に変数に代入できるため .map()
以外にも.filter()
、.flatMap()
など便利関数が使える- 初心者には分かりづらい
まとめ
- できればstream処理をかけるようにする
- 慣れないうちは通常のfor文や拡張for文を使う