java-beginner.com ブログ

プログラミングを学習するブログ(Javaをメインに)

Stream APIのfilterメソッドを使う

投稿日:

最終更新日:2016年09月20日

アイキャッチ

こんにちは。「Javaを復習する初心者」です。

今回はStream APIのfilterメソッドを使ってみました。

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

int型配列

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

java

        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クラスを作って、試してみました。

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 + "]";
    }

}

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

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

"ソース"

        Person[] persons = new Person[3];
        for (int i = 0; i < persons.length; i++) {
            persons[i]= new Person("name" + (i + 1), random.nextInt(10) + 1);
        }

        Person[] newPersons = Arrays.stream(persons)
                .filter(p -> p.age < 5)
                .toArray(Person[]::new);

        System.out.println(Arrays.toString(persons));
        System.out.println(Arrays.toString(newPersons));

"結果"

[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の要素がないことが確認できます。