LoginSignup
69
71

More than 5 years have passed since last update.

java.util.Listのループの書き方

Posted at

java.util.List は順序をもったコレクションなんすが、
(他言語出身等)Javaに不慣れな方にとっては、このコレクションのループの書き方からググらねばならんという場面に遭遇する。

そんなときなどのための、Javaのversion upでループが書きやすくなっているよというメモ。

とりあえずサンプルコード

LoopOfList.java
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);
    }
}

以下、能書き

  1. 愚直な例
    古い愚直なfor文の例。今でも、これでもぜんぜん動くんで、いいんですが、まあやはりメンテしにくい等々で、敬遠される部類と思います。get(index)でアクセスするのもなんか問題があったような?

  2. イテレータ
    これもなつかしいイテレータの書き方。Java5で、ジェネリクスが導入される前は、next()でとってくる値をキャストしないといけなかった。
    1番の例であった「i」というインデックス用の変数が不要になるのが、利点といえば利点なんだが、コード量は明らかに増える。

  3. 拡張for文
    (たしか)Java5で導入された、foreach構文。シンタックスシュガーで、コンパイル後は2番と同じ処理になるはず。だいぶ見やすくなった。

  4. ラムダ
    Java8で導入されたラムダを使う例。Listには、forEachが生えたようなので、stream()をつけなくても使える様子。

  5. ラムダだが、メソッド参照
    こちらもJava8で導入されたメソッド参照をつかう例。イメージは4番と一緒。だいぶコード量が減ってくると思われる。が、慣れないとなにやってるかわからんかも。

以上、社内教育用資料みたいなものでした。

69
71
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
69
71