Tips

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

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

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

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

固定長配列によるループ

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を使うのがポイントですよん。

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によるループ

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文行ってみましょう!

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行ってみましょう!

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ですので、ラムダが出てくるわけです。

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部分を省略してみました!
もう少し省略が可能です。

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));

	}
}

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

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行にしてみようかと。特に意味とかはないですが。

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によるループ

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>() { } の部分です。
その中に {} が重複して入っているように見えますが、これがインスタンス初期化子です。

普通に書くと

	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と同様なので、省略の方で書いていきます。

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