Tips

Java8以降でのループ処理あれこれ
2017.11.08

Java8以降でのループ処理あれこれ

おじさんなんでついていけないんです。っていったら許してくれるかなって思ったら、以外と許してくれないようです。
ですので、ループ処理あれこれ書いてみようと思います。

まず、数列を出力する俺好みのサンプル。
手始めに固定長配列の基本for文です。

固定長配列によるループ

1
2
3
4
5
6
7
8
9
10
11
12
package jp.pjin.tech.java;
 
public class StreamSample1_1 {
    public static void main(String[] args) {
        int[] arr = {
            3, 5, 8, 1, 4, 2, 6, 9, 1
        };
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
}

続いて、Java5から登場する拡張for文。
因みにjavascriptの拡張for文は、for(var val in object){ console.log(val); } みたいにかくよん。
変数定義 in オブジェクト の順番は変わらないのですが、inを使うのがポイントですよん。

1
2
3
4
5
6
7
8
9
10
11
12
package jp.pjin.tech.java;
 
public class StreamSample1_2 {
    public static void main(String[] args) {
        int[] arr = {
            3, 5, 8, 1, 4, 2, 6, 9, 1
        };
        for (int val : arr) {
            System.out.println(val);
        }
    }
}

先ほどのサンプルより短くなったと思います。このくらいでやめておけば良いのですが。。。。。。

さて、次は可変長配列に挑戦してみます。
通常のfor文で行ってみましょう!

Listによるループ

1
2
3
4
5
6
7
8
9
10
11
12
13
package jp.pjin.tech.java;
 
import java.util.Arrays;
import java.util.List;
 
public class StreamSample1_3 {
    public static void main(String[] args) {
        List<Integer> arr = Arrays.asList(3, 5, 8, 1, 4, 2, 6, 9, 1);
        for (int i = 0; i < arr.size(); i++) {
            System.out.println(arr.get(i));
        }
    }
}

配列の要素数は、固定長の場合は、lengthですが、可変長の場合は、size()ですので、お間違えの無いように!
可変長のリストを利用する場合は、Arrays#asListを使うと簡単に定義できます!

続いて、拡張for文行ってみましょう!

1
2
3
4
5
6
7
8
9
10
11
12
13
package jp.pjin.tech.java;
 
import java.util.Arrays;
import java.util.List;
 
public class StreamSample1_4 {
    public static void main(String[] args) {
        List<Integer> arr = Arrays.asList(3, 5, 8, 1, 4, 2, 6, 9, 1);
        for (int val : arr) {
            System.out.println(val);
        }
    }
}

超スッキリしましたね!
このくらいでやめておけば良いものを。。。。。。

続いて、forEach行ってみましょう!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package jp.pjin.tech.java;
 
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
 
public class StreamSample1_5 {
    public static void main(String[] args) {
        List<Integer> arr = Arrays.asList(3, 5, 8, 1, 4, 2, 6, 9, 1);
 
        arr.forEach(new Consumer<Integer>() {
            @Override
            public void accept(Integer t) {
                System.out.println(t);
            }
        });
 
    }
}

匿名クラスを利用したサンプルになります。
匿名クラスは、インターフェース(ここでは、Consumer)を実装したクラスを作成せず、インターフェースに定義されたメソッドを定義する方法です。
クラスを作成しないので、名無しクラスのインスタンスを作成することとなり、匿名クラスといわれています。ななし。

さあ、ここで、Java8ですので、ラムダが出てくるわけです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package jp.pjin.tech.java;
 
import java.util.Arrays;
import java.util.List;
 
public class StreamSample1_6 {
    public static void main(String[] args) {
        List<Integer> arr = Arrays.asList(3, 5, 8, 1, 4, 2, 6, 9, 1);
 
        arr.forEach((Integer t) -> {
            System.out.println(t);
        });
 
    }
}

Consumer部分を省略してみました!
もう少し省略が可能です。

1
2
3
4
5
6
7
8
9
10
11
12
13
package jp.pjin.tech.java;
 
import java.util.Arrays;
import java.util.List;
 
public class StreamSample1_7 {
    public static void main(String[] args) {
        List<Integer> arr = Arrays.asList(3, 5, 8, 1, 4, 2, 6, 9, 1);
 
        arr.forEach(t -> System.out.println(t));
 
    }
}

最後にメソッド参照を使ってみましょう!

1
2
3
4
5
6
7
8
9
10
11
12
package jp.pjin.tech.java;
 
import java.util.Arrays;
import java.util.List;
 
public class StreamSample1_8 {
    public static void main(String[] args) {
        List<Integer> arr = Arrays.asList(3, 5, 8, 1, 4, 2, 6, 9, 1);
 
        arr.forEach(System.out::println);
    }
}

最後は1行にしてみようかと。特に意味とかはないですが。

1
2
3
4
5
6
7
8
9
package jp.pjin.tech.java;
 
import java.util.Arrays;
 
public class StreamSample1_9 {
    public static void main(String[] args) {
        Arrays.asList(3, 5, 8, 1, 4, 2, 6, 9, 1).forEach(System.out::println);
    }
}

続いて、連想配列行ってみたいと思います!
連想配列の初期代入とかやり方忘れるし、ループも若干書くのが面倒ですよね。
連想配列にした段階でループしない場合も多いですが。。。

Mapによるループ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package jp.pjin.tech.java;
 
import java.util.LinkedHashMap;
import java.util.Map;
 
public class StreamSample1_10 {
    @SuppressWarnings("serial")
    public static void main(String[] args) {
        Map<String, String> options = new LinkedHashMap<String, String>() {
            {
                put("1", "リンゴ");
                put("2", "ゴリラ");
                put("3", "ピーナッツ");
            }
        };
 
        for (Map.Entry<String, String> entry : options.entrySet()) {
            System.out.println(entry);
        }
    }
}

今回はLinkedHashMapを利用しています。特徴は、代入した順番を保持してくれる点です。
初期代入をする場合に、匿名クラスを利用し、インスタンス初期化子を利用します。

匿名クラスは、new LinkedHashMap<String, String>() { } の部分です。
その中に {} が重複して入っているように見えますが、これがインスタンス初期化子です。

普通に書くと

1
2
3
4
Map<String, String> options = new LinkedHashMap<String, String>();
options.put("1", "リンゴ");
options.put("2", "ゴリラ");
options.put("3", "ピーナッツ");

となるのですが、別にこれでもいいじゃんということでもあります。

今回はループが基準なので、ループの説明を致します。させてください!

Mapオブジェクトは、KとVという総称型を持っています。
ですので、これをひとまとめに取る必要があります。
Map#entrySetを利用すると1行を取り出せます。

以外と忘れるので覚えておいた方が良いですよ。

Mapも当然forEachを利用できます。
匿名クラスはListと同様なので、省略の方で書いていきます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package jp.pjin.tech.java;
 
import java.util.LinkedHashMap;
import java.util.Map;
 
public class StreamSample1_10 {
    @SuppressWarnings("serial")
    public static void main(String[] args) {
        Map<String, String> options = new LinkedHashMap<String, String>() {
            {
                put("1", "リンゴ");
                put("2", "ゴリラ");
                put("3", "ピーナッツ");
            }
        };
 
        options.forEach((k, v) -> System.out.println(k + "=" + v));
    }
}

Listのものと比べると、出力される値が、キーと値になるので、引数が2つです。
この場合は省略できませので、しっかり書きます。

あれこれ書きましたが、如何でしょうか?StreamSampleって名前のクラスなのにStreamはないんかい!って突っ込みは無しの方向で。
いや、忘れていたわけではないのですよ。次回。そ、そう、次回にまわす予定です。いや、本当。

新連載はじまりました!新Java基礎 連載リンク

はじめてのJAVA 連載

Recent News

Recent Tips

Tag Search