こんにちは。「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の要素がないことが確認できます。