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());
参考
- http://www.ne.jp/asahi/hishidama/home/tech/java/stream.html
- http://enterprisegeeks.hatenablog.com/entry/2014/10/20/085500
- http://niwaka.hateblo.jp/entry/2018/03/17/124103
- https://qiita.com/IsaoTakahashi/items/b07356ba465aba5c6667
- https://www.slideshare.net/zoetrope/java8-lambdaandstream
- http://masatoshitada.hatenadiary.jp/entry/2015/02/09/190150
- https://dev.classmethod.jp/server-side/what-a-wonderful-stream-world/