絞り込みとか並び替えって意外とめんどい。
データベースを使ってれば、そもそもSQLでさくっと終わる話なんですがw
でも、便利なんだよな。
Streamインタフェースを使って、リストから絞り込みと並び替えをするサンプル
交通手段?のリストから3文字以上の交通手段を抽出。
同じコードを2パターンで書いてあります。違いはラムダさん。
その1:説明するため理解するための書き方w
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | import java.util.Arrays; import java.util.List; import java.util.function.Predicate; import java.util.stream.Collectors; public class StreamFilterTest { public static void main(String[] args) { //リストを準備 List<String> trafficList = Arrays.asList( "自動車", "バイク", "三輪車", "船", "電車", "新幹線", "地下鉄", "モノレール", "タクシー", "徒歩" ); //3文字以上でフィルタリング。ソート後に上位5件を出力。 List<String> resultList = trafficList.stream() .filter(new Predicate<String>() { //抽出条件 @Override public boolean test(String t) { return t.length() >= 3; } }) .sorted() //ソート .limit(5) //最大数 .collect(Collectors.toList()); //リスト出力 //結果を表示 System.out.println(resultList); } } |
その2:ラムダさん風なよくある書き方w
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class StreamFilterTestLambda { public static void main(String[] args) { //リストを準備 List<String> trafficList = Arrays.asList( "自動車", "バイク", "三輪車", "船", "電車", "新幹線", "地下鉄", "モノレール", "タクシー", "徒歩" ); //3文字以上でフィルタリング。ソート後に上位5件を出力。 List<String> resultList = trafficList.stream() .filter(t -> t.length() >= 3) //抽出条件 .sorted() //ソート .limit(5) //最大数 .collect(Collectors.toList()); //リスト出力 //結果を表示 System.out.println(resultList); } } |
実行結果
交通手段?のリストから3文字以上で絞り込み、ソート後の上位5件が出力されます。
1 | [タクシー, バイク, モノレール, 三輪車, 地下鉄] |
サンプルの解説
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系は最初のつもりでした。。