せてぃーずノート

Javaのイベント参加レポートとかを書いたりします。

NetBeansでJava8を試してみる その2

フィルター

帰宅が遅かった&酔っぱらいなので今日はフィルターをちょこっと試す。
というわけで、まずは昨日の処理にフィルターを追加してみた。

@Test
public void フィルター() {
    List<String> list = new ArrayList<>();
    list.add("A");
    list.add("B");
    list.add("C");
    list.stream().filter(new Predicate<String>() {
        @Override
        public boolean test(String t) {
            return "B".equals(t);
        }
    }).forEach(s -> {
        System.out.println(s);
    });
}

Bの時だけ標準出力に文字列を出します。
これだけでも動くのですが、NetBeansは「この匿名内部クラスをlambdaに変換出来ます。」とご親切に教えてくれます。
自動で変換してもらうとこんな感じになります。

    @Test
    public void フィルター変換後() {
        List<String> list = new ArrayList<>();
        list.add("A");
        list.add("B");
        list.add("C");
        list.stream().filter((String t) -> "B".equals(t)).forEach(s -> {
            System.out.println(s);
        });
    }

これだけでもいいのですが、昨日の内容を踏まえると(String t)をtに変換できます。
最終的にフィルターはこんなかんじになりました。
最初の処理に比べると、非常にシンプルになったと思います。

@Test
public void フィルター最終形() {
    List<String> list = new ArrayList<>();
    list.add("A");
    list.add("B");
    list.add("C");
    list.stream().filter(t -> "B".equals(t)).forEach(s -> {
        System.out.println(s);
    });
}
補足というかおまけというか

tやsのところは、->の左右で一致していれば問題ないです。
なのでこんなソースでもコンパイルエラーになりません!

@Test
public void かっこいいlambda() {
    List<String> list = new ArrayList<>();
    list.add("イオ");
    list.add("イオラ");
    list.add("イオナズン");
    list.stream().filter(僕の使える最強の魔法 -> "イオナズン".equals(僕の使える最強の魔法)).forEach(のヮの -> {
        System.out.println(のヮの);
    });
}


次はstreamのAPIを色々見ていこうと思います。