简述
Java8 出了个 Stream 流、让本来对汇合类操作很蠢笨的写法,变得很晦涩!置信在 Stream 没有出世之前咱们对汇合做一些累加、过滤、等一些操作都是 for for 一路的 forrr 到底!代码量也是够大!写过 php 的同学都用过 Collection
类的流式操作,真是顺畅!本文是带大家介绍下 Steam 里 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