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はないんかい!って突っ込みは無しの方向で。
いや、忘れていたわけではないのですよ。次回。そ、そう、次回にまわす予定です。いや、本当。