Java Streamインタフェースを使って、リストから絞り込みと並び替えをする




絞り込みとか並び替えって意外とめんどい。
データベースを使ってれば、そもそもSQLでさくっと終わる話なんですがw
でも、便利なんだよな。

Streamインタフェースを使って、リストから絞り込みと並び替えをするサンプル

交通手段?のリストから3文字以上の交通手段を抽出。
同じコードを2パターンで書いてあります。違いはラムダさん。

その1:説明するため理解するための書き方w

その2:ラムダさん風なよくある書き方w

実行結果

交通手段?のリストから3文字以上で絞り込み、ソート後の上位5件が出力されます。

サンプルの解説

List#stream() ※正しくはCollection#stream()

List#stream()を使うことで、ストリームAPIへ持ち込むことができます。
Streamクラスはメソッドチェーンが前提で作られているで、あとはこんな感じにメソッドをつなげて書けます。

Stream#filter(Predicate)

この例では3文字以上で絞り込みです。つまり、フィルタする条件を書いておくとこですね。

上にも書いてますが、サンプルコード2つの違いはここです。
1つめは無名関数(匿名クラス、匿名関数などは同義)で書いたもの。2つめはラムダ式のものです。
絞り込みは、Predicate関数型インタフェースの実装メソッド(test)で返すbooleanで判断されます。

余談ですが、関数型インタフェースでもこんな感じで書けるので、ラムダ式がマストじゃないってこともわかりますねw
というわけで、ラムダ式はあくまでも簡潔に書けるってだけ。何か特別なものではありません。
まあ、ラムダの方が楽なわけですが。ぱっと見て中身(引数と返り値)わからんよね。

Stream#sorted()

並び替えです。
この例では、引数未指定なので自然順序(≒文字コード順)です。
自分で比較したい場合は、引数足しましょう。

Stream#limit()

数の絞り込みです。
この例では、5を指定しているので、ソート後の上位5個に絞り込まれます。

Stream#collect()

リストへ変換です。
この例では素直にリストにしていますが、SQLで言う「group by」のような感じでMapに渡したりすることもできます。

・・記事の公開する順番間違えたw
すみません。こっちがストリームAPI系は最初のつもりでした。。