簡述
Java8出了個Stream流、讓原本對集合類操作很笨拙的寫法,變得很流暢!相信在Stream沒有出生之前我們對集合做一些累加、過濾、等一些操作都是for for 一路的 forrr到底!代碼量也是夠大!寫過php的同學都用過Collection
類的流式操作,真是順暢!本文是帶大家介紹下Stream里Filter的一些基本用法!
准備代碼
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
// getter setter
}
//搞幾個數據
public List<Person> personList() {
List<Person> list = new ArrayList<>();
list.add(new Person("Lily", 12));
list.add(new Person("HanMei", 10));
list.add(new Person("Lucy", 15));
list.add(new Person("Lilei", 10));
return list;
}
Filter
基本過濾
Java8的lambda
很方便的讓我們可以先申明一個變量指向一個函數,這種寫法在很多編程語言里都支持,只是寫法不一。在php里就叫匿名函數
@Test
public void test_filter() {
Predicate<Person> nameFilter = (person) -> person.getName().contains("Li");
List<Person> containsLi = personList().stream()
.filter(nameFilter)
.collect(Collectors.toList());
System.out.println(containsLi);
}
上面的例子是過濾出personList
里帶有Li
字符的人的集合,用法很簡單。
多條件過濾
@Test
public void test_multi_filter() {
Predicate<Person> nameFilter = (person) -> person.getName().contains("Li");
Predicate<Person> ageFilter = (person) -> person.getAge() >= 12;
// 這里你可以用and 、isEqual
List<Person> multiPerson = personList().stream()
.filter(nameFilter.or(ageFilter))
.collect(Collectors.toList());
System.out.println(multiPerson);
}
可以看到,采用了多條件鏈式調用的方法,傳遞了多個判斷邏輯,是不是很好用呢!
代碼在GitHub