在Java中常會有從一個集合(例如List
)中依條件篩選元素,並將符合條件的元素放入另一個集合的操作,本篇介紹如何使用Java 8的Stream.filter()
搭配Stream.collect()
來達成。
下面是List
中的元素Person
類別
Person.java
public class Person {
enum Sex {
MALE, FEMALE;
}
private String name;
private Sex gender;
private int age;
public Person(String name, Sex gender, int age) {
this.name = name;
this.gender = gender;
this.age = age;
}
// 省略getter setter
}
下面分別使用原本for loop的方式及Java 8的Stream.filter()
搭配Stream.collect()
來篩選出男性,年齡小於18歲的兒童,並放入新的List
容器中。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
// ....
List<Person> personList = Arrays.asList(
new Person("John", Sex.MALE, 10),
new Person("Mary", Sex.FEMALE, 11),
new Person("Bill", Sex.MALE, 12),
new Person("Jane", Sex.FEMALE, 21),
new Person("Tony", Sex.MALE, 22)
);
// 使用傳統的for loop
List<Person> maleChildrenList1 = new ArrayList<>();
for(Person person : personList) {
if(person.getGender() == Person.Sex.MALE) {
if(person.getAge() < 18) {
maleChildrenList1.add(person);
}
}
}
for(Person person : maleChildrenList1) {
System.out.println(person.getName() + ":" + person.getGender() + ":" + person.getAge());
}
// Java 8 Stream.fitler, Stream.collect
List<Person> maleChildrenList2 = personList.stream()
.filter(e -> e.getGender() == Person.Sex.MALE)
.filter(e -> e.getAge() < 18)
.collect(Collectors.toList());
maleChildrenList2.forEach(
e -> System.out.println(e.getName() + ":" + e.getGender() + ":" + e.getAge()));
Stream.collect()
的輸入參數為Collector
,可使用java.util.stream.Collectors.toList()
,此方法會將filter後的Stream中的元素放入新的ArrayList
中。
toList()
其方法同Collectors.toCollection(ArrayList::new)
如下:
List<Person> maleChildrenList2 = personList.stream()
.filter(e -> e.getGender() == Person.Sex.MALE)
.filter(e -> e.getAge() < 18)
.collect(Collectors.toCollection(ArrayList::new)); // Java 8 method references語法
如果本篇有幫助到您,幫忙點一下廣告支持,感恩。
參考:
很清楚 比openhome清楚 還附上person物件 讚讚 幫你點廣告
回覆刪除這篇很棒 謝謝~
回覆刪除