おじさんなんでついていけないんです。っていったら許してくれるかなって思ったら、以外と許してくれないようです。
ですので、ループ処理あれこれ書いてみようと思います。
まず、数列を出力する俺好みのサンプル。
手始めに固定長配列の基本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はないんかい!って突っ込みは無しの方向で。
いや、忘れていたわけではないのですよ。次回。そ、そう、次回にまわす予定です。いや、本当。