こんにちは。ハンドルネーム「Javaを復習する初心者」です。このサイトはプログラミング言語Javaの復習・学習をするブログです。プログラムの開発・実行はEclipseで行ってます。
スポンサーリンク
お知らせ
  • 参考文献のページ作りました。
  • Amazon.co.jpアソシエイトに参加していますが、参考文献の紹介はもしもアフィリエイトに統一しました。
  • 2016年10月9日からは投稿ペースを落とします。週1回くらいにする予定です。
スポンサーリンク

Stream APIのfilterメソッドを使う

こんにちは。「Javaを復習する初心者」です。今回はStream APIのfilterメソッドを使ってみました。

filterメソッドを使うとストリームから条件に合致する要素のみを残すことができます。

int型配列

例えば、int型配列numsから5未満の要素を残すことを考えます。Arrays.streamを使ってストリームを生成し、filterメソッドで条件を満たす要素のみを残すということができます。以下は、10個の要素からなる配列にランダムに整数を格納してfilterメソッドを使った例です。

        int[] nums = new int[10];
        Random random = new Random();
        for (int i = 0; i < nums.length; i++) {
            nums[i] = random.nextInt(10);
        }

        int[] newNums = Arrays.stream(nums)
                .filter(num -> num < 5)
                .toArray();

        System.out.println(Arrays.toString(nums));
        System.out.println(Arrays.toString(newNums));
[8, 2, 0, 2, 5, 0, 7, 5, 6, 1]
[2, 0, 2, 0, 1]

配列numsから生成したストリームにfilterメソッドを使い、toArrayメソッドで配列に変換しています。「filter(num -> num < 5)」の箇所はラムダ式です。要素numから条件「num < 5」をreturnしています。配列に変換した結果を配列newNumsに格納しています。実行結果を見ると、配列newNumsには5以上の要素は残っていないことが分かります。

クラス配列

上記はint型の配列で試しましたが、クラスの配列も扱うことができます。以下のPersonクラスを作って、試してみました。

public class Person {

    public String name;
    public int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }

}
[/java]

toStringメソッドをオーバーライドしているのは、確認用です。

Personの配列を用意し、フィールドageの値をfilterで制限してみました。以下はソースと実行結果です。




[Person [name=name1, age=6], Person [name=name2, age=2], Person [name=name3, age=2]]
[Person [name=name2, age=2], Person [name=name3, age=2]]

プログラムではフィールドageが5より小さい要素のみを残して、新しい配列をnewPersonsに格納しています。実行結果を見ると、newPersonsの要素にはage=6の要素がないことが確認できます。