支援対象地域:札幌、仙台、関東、愛知、関西、広島、福岡


Java stream APIの使い方

Java stream APIの長所


Java Stream APIを利用した処理の良いところは、何の処理でどのようなデータになっているのか読みやすく

書かれている点にあります。これがfor文の場合は、全体を見渡さないと、どういった結果になるのかわからないことがあります。ですので、バグやエラーを生み出しやすいfor文よりも今回導入されたJava stream APIを積極的に用いることで、より不具合の少ない簡潔でわかりやすいコードが記述できるようになります。

基本的な流れ

1.コレクションからstreamを取得。

2.streamに対して満足するまで「中間操作」を実行。コレクションの中身を都合よく変換。

3.「終端操作」で変換したコレクションの中身に対して処理を適用する。

Java stream APIの使用例を見てみよう

ここでは、使用例としてJava stream APIを用いた構文見ていきましょう。

「1〜5の中で偶数だけを表示する」

①Java stream APIを使わない場合

List<Integer>integerList = Arrays.asList(1,2,3,4,5);

for(Integer i : integerList){

if( I %2==0){

System.out.println( I );

   }

}

②Java stream APIを使う場合

List<Integer>integerList = Arrays.asList(1,2,3,4,5);

integerList.stream() //streamの取得

  .filter( i -> i %2==0)//中間操作

  .forEatch( I ->System.out.println(i);//終盤操作

①と②で処理の違いを見てみる

①(stream APIを使わないパターン)では「2で割り切れたら表示」という構造になっています。
②(stream APIを使うパターン)では「2で割り切れるものを集める(中間操作)→」「要素をすべて出力(終盤操作)」という2処理に分割してできています。
Java stream APIを用いることによって、読みやすく、スッキリしたコードに仕上がります。

様々な中間操作と終盤操作

よく使われる中間操作と終盤操作のメソッドを一部挙げていきます。

中間操作

・filter

名前の通り、コレクションの要素をフィルタリングするものです。filterメソッドには T->booleanとなるラムダ式を渡してあげます。ラムダ式がtrueの要素のみに絞ったstreamを返します。

・map

mapの引数にはT->Uとなるラムダ式を渡してあげます。要素を変換する中間操作です。

・sorted

sortedの引数には(T.T)-> intとなるラムダ式を渡してあげます。要素を並び替える中間操作です。要素を2ずつ取り、ラムダ式に渡していきます。返り値が正なら降順、負なら昇順になります。

以上3つが主に使われる中間操作のメソッドです。

終盤操作

終盤処理はstream内の各要素に対して、forループを最後まで(または条件一致まで)回す処理び該当します。したがって、無限ストリームを扱う場合は無限ループにならないように条件式に制限するなど気を付けることが必要です。

・forEach(副作用)

forEatchの引数には(T)->voidとなるラムダ式を渡してあげます。名前の通り、「要素を1つずつ取り出して行って処理を実行」するメソッドです。Javaだと拡張for文に相当します。

・count(集計)

countは要素数を計算します。streamは要素数不定のデータ型であるため、要素数算出のために最後の要素までループが実行されることに注意する必要があります。

・allMatch(条件判定)

allmatchは、Predicate<T>のラムダ式を取るメソッドであり、戻り値はbooleanである。そしてAnd条件であり、すべての要素がPredicateを満たすか判定し、満たさない要素が発生した時点で処理を打ち切る。

まとめ


さて、ここまででJava stream APIについての記述方法や一部メソッドの意味がわかってきたと思いますが、順序が大切な処理は当然あるため、並列化が可能な所は案外少ないかもしれません。また並列化による処理スピードアップの代償に並列化特有のバグやエラーに悩まされる事もあります。
そこで、「for文を使わずstream APIに置き換えることから始める」というような考え方はいかがでしょうか?とりあえずstreamを実装しておけばいつでも並列に変更できるので、柔軟な対応ができると共にラムダ式に慣れるための練習にもなります。
さて、今回はJava8の新機能streamAPIについてご紹介いたしました。stream APIの魅力が少しでも伝わったのならば幸いです。最後までお読み頂きありがとうございました。