LoginSignup
12
13

More than 5 years have passed since last update.

[java8] 4回目:ラムダ式とStreamAPI

Last updated at Posted at 2014-11-09

前回:PermGenの廃止

さて、StreamAPIとは何でしょう?どこかの説明を引用すると、

StreamAPIとは、コレクションなどの集合体に対し、集計や処理を行うことを目的としている。

そうです。
とりあえず、サンプルを作って動かしてみましょう。

StreamAPI

対象データの集計とソートを行う

    /**
    sで始まる名前を抽出し、降順にソートするサンプル
    */
    public static void ramdaSampleFilterSort() {
        final String[] data = {"shimizu", "tanaka", "sasaki", "suzaki"};
        final List<String> list = Arrays.asList(data);

        // 1.7までの書き方
        List<String> ar1 = new ArrayList<>();
        for(String a : list) {
            if(a.startsWith("s")) {
                ar1.add(a);
            }
        }
        Collections.sort(ar1, new Comparator<String>() {

            @Override
            public int compare(String o1, String o2) {
                return o2.compareTo(o1);
            }
        });
        System.out.println(ar1);

        // 1.8での書き方
        // Listからstreamを生成できる
        List<String> ar2 = list.stream()
                .filter(e -> e.startsWith("s"))
                .sorted((e1, e2) -> e2.compareTo(e1))
                .collect(Collectors.toList());
        System.out.println(ar2);
    }

結果

[suzaki, shimizu, sasaki]
[suzaki, shimizu, sasaki]

  • Listインタフェースに追加されたstream()から、streamを取得できます
  • filter()メソッドで、sで始まる名前のみを抽出しています。
    • 引数は関数型インタフェースのため、ラムダ式を使います。
  • sorted()メソッドでソートを行います。
    • 引数は関数型インタフェースのため、ラムダ式を使います。
  • 最後、collect()で、StreamからListに変換しています。
  • コード例のように、メソッドチェーンで書けます。

最大値を取得する

    public static void ramdaSampleFilterMax() {
        final Integer[] data = {111, 10, 34, 99, 1092, 3};

        // 配列からもstreamを生成できる
        Integer max = Arrays.stream(data)
            .max((e1, e2) -> e1.compareTo(e2))
            .get();

        System.out.println("max value is " + max);

        final Integer[] data2 = {10000, 345};

        // 二つのstreamを結合することもできる
        max = Stream.concat(Arrays.stream(data), Arrays.stream(data2))
            .max((e1, e2) -> e1.compareTo(e2))
            .get();

        System.out.println("max value is " + max);
    }

結果

max value is 1092
max value is 10000

最後に

何となく雰囲気はつかめたのではないでしょうか?
シンプルなコードになることが分かりますね。

次回も引き続き、StreamAPIについて、別のサンプルを見てみたいと思います。

12
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
13