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