Java8,Stream之filter简单介绍

Posted Savey

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java8,Stream之filter简单介绍相关的知识,希望对你有一定的参考价值。

简述

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

以上是关于Java8,Stream之filter简单介绍的主要内容,如果未能解决你的问题,请参考以下文章

玩转Java8Stream之函数式接口

java8 stream ,filter 等功能代替for循环

Java8速查手册

乐字节-Java8新特性-接口默认方法之Stream流(下)

java8 .stream().sorted().filter().map().collect()用法

java8 stream.filter 过滤集合中的数据