技術メモ

技術メモ

ラフなメモ

Streamを使ってfor文をStreamで書き換える

概要

コードレビューなどをしている/されているとJava8よりも前の文法で記述されたコードに対して、Streamを使ってみましょう!というレビューが返ってくることがあります。for文をStreamに置き換える簡単な例を見てみます。

単純なfor文

単純なforループはStreamで簡単に記述できます。

    for (int i = 0; i < 10; i++) {
      // doSomething() ...
      System.out.print(i + " ");
    }
    IntStream.range(0, 10).forEach(i ->
    // doSomething() ...
    System.out.print(i + " "));

FizzBuzz

1から30までの数値でFizzBuzzしてみます。

Java7までの書き方だと以下のようになります。

    for (int i = 1; i <= 30; i++) {
      if (i % 15 == 0) {
        System.out.println("FizzBuzz");
      } else if (i % 3 == 0) {
        System.out.println("Fizz");
      } else if (i % 5 == 0) {
        System.out.println("Buzz");
      } else {
        System.out.println(String.valueOf(i));
      }
    }

Streamを使うと以下のようになります。三項演算子がネストしているのがちょっと分かりにくいですね。

    IntStream.rangeClosed(1, 30)
    .mapToObj(i -> i % 15 == 0 ? "FizzBuzz"
        : i % 3 == 0 ? "Fizz"
            : i % 5 == 0 ? "Buzz"
                : String.valueOf(i))
    .forEach(s -> System.out.println(s));

階乗の計算

10!(1から10までの階乗)の計算をしてみます。

Java7までの書き方

    long result = 1;
    for (int i = 1; i <= 10; i++) {
      result *= i;
    }
    System.out.println(result);

Streamを使った書き方

    System.out.println(LongStream.rangeClosed(1, 10).reduce(1, (s, t) -> s * t));

Listの変換

あるListを処理して、別のListに詰め替えるような処理をする場合です。

従来の拡張for文を使った書き方だと以下のようになります。

    List<Hoge> hogeList = Arrays.asList(new Hoge(1, "aaa"), new Hoge(2, "bbb"), new Hoge(3, "ccc"));
    List<Foo> fooList = new ArrayList<>();
    for (Hoge hoge : hogeList) {
      // なんらかの処理をして、fooListにaddする
      fooList.add(new Foo(hoge.getHogeId(), hoge.getHogeName()));
    }

これはStreamを使って以下のように書くことができます。mapメソッドはとても便利だと思います。

    List<Hoge> hogeList = Arrays.asList(new Hoge(1, "aaa"), new Hoge(2, "bbb"), new Hoge(3, "ccc"));
    List<Foo> fooList = hogeList.stream().map(e -> new Foo(e.getHogeId(), e.getHogeName()))
        // .filter( ... ) などでstreamの抽出条件なども記述できる
        .collect(Collectors.toList());

参考

  1. http://www.ne.jp/asahi/hishidama/home/tech/java/stream.html
  2. http://enterprisegeeks.hatenablog.com/entry/2014/10/20/085500
  3. http://niwaka.hateblo.jp/entry/2018/03/17/124103
  4. https://qiita.com/IsaoTakahashi/items/b07356ba465aba5c6667
  5. https://www.slideshare.net/zoetrope/java8-lambdaandstream
  6. http://masatoshitada.hatenadiary.jp/entry/2015/02/09/190150
  7. https://dev.classmethod.jp/server-side/what-a-wonderful-stream-world/