[Java] 基礎 for / 拡張for / forEach の使い方

Java

for , 拡張for , forEach (ラムダ式) は、同じ処理を繰り返し行うループ処理を実行させるための構文。
Java8 から、ラムダ式と、ラムダ式と共に使う forEach メソッドが追加された。( forEach (ラムダ式)は Java8 以降出ないと使えないよ。)

スポンサーリンク

for 文の使い方

変数を省略できたりするので、書き方が複数ある。

基本形

for(int i = 0; i < 5; i++) {
    System.out.println(i+"回目");
}
for() の中身について
int i = 0;初期化という作業で、変数 i0 からスタートするよ!と宣言している。
i < 5;条件式で、変数 i5 未満になるまでループ処理を続けるよ!と宣言している。
i++変数 i は、ループ 1 回につき 1 ずつ増えるよ!と宣言している。
i++ は、 i = i + 1 と同じ意味。 2 ずつ増やしたいなら、 i = i + 2 と書くし、減らしたいなら、 i-- と書くことができる。

省略形

初期化部分であるカウンタ変数の省略
int i = 0;
for(; i < 5; i++) {
    System.out.println(i+"回目");
}

PHP だと、ループの外で宣言した変数を使う場合、 for(i; i < 5; i++) と書くことができるが、 Java だと PHP のように書くとエラーになるので省略形を使う。

カウンタ変数の増減の省略
for(int i = 0; i < 5; ) {
  System.out.println(i+"回目");
  i++;
}

増減を省略する場合は、ループ内にカウンタを増やす、減らすの処理を書く必要がある。

条件式の省略
int i = 0;
for(;;) {
  System.out.println(i+"回目");
  i++;
  if (i == 5) {
    break;
  }
}

条件式を省略すると無限ループになるので、 break とかで処理を終わらせる記述が必要。

拡張for 文の使い方

配列やコレクションに対して(イテレータを使っているため)、ループ処理をさせるときの構文。

// 配列
int list[] = {10, 20, 30};

for (int n : list){
  System.out.println(n);
}

これは、基本形の以下と同じ

int list[] = {10, 20, 30};

for (int i = 0; i < list.length; i++) {
  int n = list[i];
  System.out.println(n);
}

forEach メソッドの使い方

拡張for 文と同様にイテレータを使うため、コレクションに対してループ処理させる構文。
ラムダ式を使って、拡張for 文よりさらに短いコードで記述することができる。

ArrayList を使う

// ArrayList
List<String> strList = new ArrayList<>();
strList.add("アイウエオ");
strList.add("カキクケコ");
strList.add("サシスセソ");

strList.forEach(s -> System.out.println(s));

配列 を使う

// 配列
int list[] = {10, 11, 12, 13, 14};
Arrays.stream(list).forEach(n -> System.out.println(n));
// または
Integer list1[] = {10, 11, 12, 13, 14};
Arrays.asList(list1).forEach(n -> System.out.println(n));
forEach はそのままでは配列に使うことができないので、 List に変換するか、 StreamAPI の Arrays.stream() メソッドを使う。
ただし、 ArrayList はプリミティブ型( intchar 型)が使えず、 asList() メソッドも同様にラッパークラスでないと使えない。

Map を使う

// Map
Map<Integer, String> map = new HashMap<>();
map.put(1 , "アイウエオ");
map.put(2 , "カキクケコ");
map.put(3 , "サシスセソ");

map.forEach((key, val) -> System.out.println(key + " は " + val));
// または
map.forEach((key, val) -> {
    // 処理を記述
});

Posted by Agopeanuts