java.util.List は順序をもったコレクションなんすが、
(他言語出身等)Javaに不慣れな方にとっては、このコレクションのループの書き方からググらねばならんという場面に遭遇する。
そんなときなどのための、Javaのversion upでループが書きやすくなっているよというメモ。
とりあえずサンプルコード
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
public class LoopOfList {
public static void main(String[] args){
List<String> list = Arrays.asList("A", "B", "C");
// 1. 愚直な例
for(int i = 0; i < list.size(); ++i){
String s = list.get(i);
System.out.println(s);
}
// 2. イテレータ
for(Iterator<String>itr = list.iterator(); itr.hasNext();){
String s = itr.next();
System.out.println(s);
}
// 3. 拡張for文
for(String s : list){
System.out.println(s);
}
// 4. ラムダ
list.forEach(s -> {
System.out.println(s);
});
// 5. ラムダだが、メソッド参照
list.forEach(System.out::println);
}
}
以下、能書き
-
愚直な例
古い愚直なfor文の例。今でも、これでもぜんぜん動くんで、いいんですが、まあやはりメンテしにくい等々で、敬遠される部類と思います。get(index)でアクセスするのもなんか問題があったような? -
イテレータ
これもなつかしいイテレータの書き方。Java5で、ジェネリクスが導入される前は、next()でとってくる値をキャストしないといけなかった。
1番の例であった「i」というインデックス用の変数が不要になるのが、利点といえば利点なんだが、コード量は明らかに増える。 -
拡張for文
(たしか)Java5で導入された、foreach構文。シンタックスシュガーで、コンパイル後は2番と同じ処理になるはず。だいぶ見やすくなった。 -
ラムダ
Java8で導入されたラムダを使う例。Listには、forEachが生えたようなので、stream()をつけなくても使える様子。 -
ラムダだが、メソッド参照
こちらもJava8で導入されたメソッド参照をつかう例。イメージは4番と一緒。だいぶコード量が減ってくると思われる。が、慣れないとなにやってるかわからんかも。
以上、社内教育用資料みたいなものでした。