# 用 Java 过滤列表

原文：http://zetcode.com/java/filterlist/

在本教程中，我们展示了如何使用 Java 过滤列表。

本教程介绍了六种过滤列表的方法。 我们使用四个不同的库：Apache Commons，Google Guava，Eclipse Collections 和 Spring core。

在所有六个示例中，我们将过滤人员列表。 `Person`是具有三个属性的 Java 类：`age`，`name`和`sex`。

## 使用 Java `for`循环过滤列表

在第一个示例中，我们使用迭代来过滤 Java 中的列表。

`com/zetcode/Person.java`

```java
package com.zetcode;

enum Gender {
    MALE, FEMALE
}

public class Person {

    private int age;
    private String name;
    private Gender sex;

    public Person(int age, String name, Gender sex) {

        this.age = age;
        this.name = name;
        this.sex = sex;
    }

    public int getAge() {

        return age;
    }

    public void setAge(int age) {

        this.age = age;
    }

    public String getName() {

        return name;
    }

    public void setName(String name) {

        this.name = name;
    }

    public Gender getSex() {

        return sex;
    }

    public void setSex(Gender sex) {

        this.sex = sex;
    }

    @Override
    public String toString() {

        final StringBuilder sb = new StringBuilder("Person{");

        sb.append("age=").append(age);
        sb.append(", name='").append(name).append('\'');
        sb.append(", sex=").append(sex);
        sb.append('}');

        return sb.toString();
    }
}

```

我们有这个`Person` bean。 我们将过滤包含这些 bean 的列表。 `toString()`方法给出了 bean 的字符串表示形式。 当我们打印过滤后的元素列表时，这将很有帮助。

`com/zetcode/FilterListEx.java`

```java
package com.zetcode;

import java.util.ArrayList;
import java.util.List;

public class FilterListEx {

    public static void main(String[] args) {

        var p1 = new Person(34, "Michael", Gender.MALE);
        var p2 = new Person(17, "Jane", Gender.FEMALE);
        var p3 = new Person(28, "John", Gender.MALE);
        var p4 = new Person(47, "Peter", Gender.MALE);
        var p5 = new Person(27, "Lucy", Gender.FEMALE);

        var persons = List.of(p1, p2, p3, p4, p5);

        var result = new ArrayList<Person>();

        for (Person person: persons) {

            if (person.getAge() > 30) {

                result.add(person);
            }
        }

        System.out.println(result);
    }
}

```

该示例过滤人员列表。 结果列表包含 30 岁以上的人。

```java
for (Person person: persons) {

    if (person.getAge() > 30) {

        result.add(person);
    }
}

```

一个`for`循环用于遍历人员列表并创建一个新的具有 30 岁以上人员的人员。

```java
[Person{age=34, name=Michael, sex=MALE}, Person{age=47, name=Peter, sex=MALE}]

```

这是示例的输出。

## 使用 Java8 流过滤列表

在下一个示例中，我们使用 Java8 流 API 来过滤列表。

`com/zetcode/FilterListEx2.java`

```java
package com.zetcode;

import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public class FilterListEx2 {

    public static void main(String[] args) {

        var p1 = new Person(34, "Michael", Gender.MALE);
        var p2 = new Person(17, "Jane", Gender.FEMALE);
        var p3 = new Person(28, "John", Gender.MALE);
        var p4 = new Person(47, "Peter", Gender.MALE);
        var p5 = new Person(27, "Lucy", Gender.FEMALE);

        var persons = List.of(p1, p2, p3, p4, p5);

        Predicate<Person> byAge = person -> person.getAge() > 30;

        var result = persons.stream().filter(byAge)
                .collect(Collectors.toList());

        System.out.println(result);
    }
}

```

Java 流 API 用于过滤数据以仅包含 30 岁以上的人员。

```java
Predicate<Person> byAge = person -> person.getAge() > 30;

```

该谓词返回年龄大于三十的元素。

```java
var result = persons.stream().filter(byAge)
        .collect(Collectors.toList());

```

`persons`列表用谓词过滤，并生成一个新的结果列表。

## 使用 Apache `CollectionUtils`过滤列表

在下一个示例中，我们使用 Apache `CollectionUtils`过滤数据。 它为`Collection`实例提供了工具方法和修饰符。

```java
<dependency>
    <groupId>commons-collections</groupId>
    <artifactId>commons-collections</artifactId>
    <version>3.2.2</version>
</dependency>

<dependency>
    <groupId>commons-lang</groupId>
    <artifactId>commons-lang</artifactId>
    <version>2.6</version>
</dependency>

```

我们使用这些 Maven 依赖项。 `commons-lang`用于`toString()`方法中使用的`ToStringBuilder`。

`com/zetcode/Person.java`

```java
package com.zetcode;

import org.apache.commons.lang.builder.ToStringBuilder;

enum Gender {
    MALE, FEMALE
}

public class Person {

    private int age;
    private String name;
    private Gender sex;

    public Person(int age, String name, Gender sex) {

        this.age = age;
        this.name = name;
        this.sex = sex;
    }

    public int getAge() {

        return age;
    }

    public void setAge(int age) {

        this.age = age;
    }

    public String getName() {

        return name;
    }

    public void setName(String name) {

        this.name = name;
    }

    public Gender getSex() {

        return sex;
    }

    public void setSex(Gender sex) {

        this.sex = sex;
    }

    @Override
    public String toString() {

        return new ToStringBuilder(Person.class).
                append("Age", age).
                append("Name", name).
                append("Sex", sex).
                toString();
    }
}

```

`toString()`方法内部的`ToStringBuilder()`对`Person` bean 进行了改进。

`com/zetcode/FilterListEx3.java`

```java
package com.zetcode;

import org.apache.commons.collections.CollectionUtils;

import java.util.ArrayList;
import java.util.List;

public class FilterListEx3 {

    public static void main(String[] args) {

        var p1 = new Person(34, "Michael", Gender.MALE);
        var p2 = new Person(17, "Jane", Gender.FEMALE);
        var p3 = new Person(28, "John", Gender.MALE);
        var p4 = new Person(47, "Peter", Gender.MALE);
        var p5 = new Person(27, "Lucy", Gender.FEMALE);

        var persons = List.of(p1, p2, p3, p4, p5);

        var result = new ArrayList<>(persons);

        CollectionUtils.filter(result, o -> ((Person) o).getAge() < 30);

        System.out.println(result);
    }
}

```

该示例使用 Apache Commons 库中的 Apache `CollectionUtils`过滤人员 bean 列表。

```java
var result = new ArrayList<>(persons);

```

将创建列表的新副本。

```java
CollectionUtils.filter(result, o -> ((Person) o).getAge() < 30);

```

`CollectionUtils.filter()`通过对每个元素应用谓词来过滤集合。 如果谓词返回`false`，则删除该元素。

## 使用 Google Guava 过滤列表

在以下示例中，我们使用 Google Guava 过滤列表。 Google Guava 是 Java 通用库的开源集。

```java
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>19.0</version>
</dependency>

```

对于 Guava 库，我们使用此依赖项。

`com/zetcode/Person.java`

```java
package com.zetcode;

import com.google.common.base.MoreObjects;

enum Gender {
    MALE, FEMALE
}

public class Person {

    private int age;
    private String name;
    private Gender sex;

    public Person(int age, String name, Gender sex) {

        this.age = age;
        this.name = name;
        this.sex = sex;
    }

    public int getAge() {

        return age;
    }

    public void setAge(int age) {

        this.age = age;
    }

    public String getName() {

        return name;
    }

    public void setName(String name) {

        this.name = name;
    }

    public Gender getSex() {

        return sex;
    }

    public void setSex(Gender sex) {

        this.sex = sex;
    }

    @Override
    public String toString() {

        return MoreObjects.toStringHelper(Person.class)
                .add("Age", age)
                .add("Name", name)
                .add("Sex", sex)
                .toString();
    }
}

```

`MoreObjects.toStringHelper()`用于改进`toString()`方法。

`com/zetcode/FilterListEx4.java`

```java
package com.zetcode;

import com.google.common.base.Predicate;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.Lists;

public class FilterListEx4 {

    public static void main(String[] args) {

        var persons = Lists.newArrayList(

                new Person(34, "Michael", Gender.MALE),
                new Person(17, "Jane", Gender.FEMALE),
                new Person(28, "John", Gender.MALE),
                new Person(47, "Peter", Gender.MALE),
                new Person(27, "Lucy", Gender.FEMALE)
        );

        Predicate<Person> byGender = person -> person.getSex() == Gender.MALE;

        var results = FluentIterable.from(persons)
                .filter(byGender)
                .toList();

        System.out.println(results);
    }
}

```

该代码示例过滤列表以仅包含男性。

```java
var persons = Lists.newArrayList(

        new Person(34, "Michael", Gender.MALE),
        new Person(17, "Jane", Gender.FEMALE),
        new Person(28, "John", Gender.MALE),
        new Person(47, "Peter", Gender.MALE),
        new Person(27, "Lucy", Gender.FEMALE)
);

```

我们使用 Guava 的`newArrayList()`方法在一张照片中创建一个可变列表。

```java
Predicate<Person> byGender = person -> person.getSex() == Gender.MALE;

```

对于男性，此谓词返回`true`。

```java
var results = FluentIterable.from(persons)
        .filter(byGender)
        .toList();

```

使用`FluentIterable`，我们使用谓词过滤原始列表并将其放入新列表中。

## 使用 Eclipse 集合过滤列表

在以下示例中，我们将使用 Eclipse 集合过滤列表。

Eclipse 集合是 Java 的集合框架。 它具有与 JDK 兼容的`List`，`Set`和`Map`实现，并具有丰富的 API，在 JDK 中找不到的其他类型（例如`Bags`，`Multimaps`）以及与所有与 JDK 兼容的任何工具`Collections`，`Arrays`，`Maps`或`Strings`。

```java
<dependency>
    <groupId>org.eclipse.collections</groupId>
    <artifactId>eclipse-collections-api</artifactId>
    <version>7.1.0</version>
</dependency>

<dependency>
    <groupId>org.eclipse.collections</groupId>
    <artifactId>eclipse-collections</artifactId>
    <version>7.1.0</version>
</dependency> 

```

对于程序，我们使用这两个 Maven 依赖项。

`com/zetcode/FilterListEx5.java`

```java
package com.zetcode;

import org.eclipse.collections.api.block.predicate.Predicate;
import org.eclipse.collections.impl.factory.Lists;
import org.eclipse.collections.impl.utility.Iterate;

import java.util.List;

public class FilterListEx5 {

    public static void main(String[] args) {

        var persons = Lists.immutable.of(

                new Person(34, "Michael", Gender.MALE),
                new Person(17, "Jane", Gender.FEMALE),
                new Person(28, "John", Gender.MALE),
                new Person(47, "Peter", Gender.MALE),
                new Person(27, "Lucy", Gender.FEMALE)
        );

        Predicate<Person> lessThan30 = (Predicate<Person>) person -> person.getAge() < 30;

        var result = (List<Person>) Iterate.select(persons, lessThan30);
        System.out.println(result);
    }
}

```

该代码示例创建一个包含 30 岁以下人员的过滤列表。

```java
Predicate<Person> lessThan30 = (Predicate<Person>) person -> person.getAge() < 30;

```

创建谓词以接受年龄小于 30 的元素。

```java
var result = (List<Person>) Iterate.select(persons, lessThan30);

```

`Iterate.select()`返回一个新集合，其中仅包含对于指定谓词求值为`true`的元素。

## 使用 Spring 的`CollectionUtils`过滤列表

在下一个示例中，我们将使用 Spring 的`CollectionUtils`过滤列表。 它包含其他收集工具方法。

```java
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>5.1.7.RELEASE</version>
</dependency>

```

该项目包含 Spring Core JAR 的 Maven 依赖项。

`com/zetcode/FilterListEx6.java`

```java
package com.zetcode;

import org.springframework.cglib.core.CollectionUtils;

import java.util.ArrayList;
import java.util.Arrays;

public class FilterListEx6 {

    public static void main(String[] args) {

        var p1 = new Person(34, "Michael", Gender.MALE);
        var p2 = new Person(17, "Jane", Gender.FEMALE);
        var p3 = new Person(28, "John", Gender.MALE);
        var p4 = new Person(47, "Peter", Gender.MALE);
        var p5 = new Person(27, "Lucy", Gender.FEMALE);

        var persons = Arrays.asList(p1, p2, p3, p4, p5);

        var result = new ArrayList<>(persons);

        CollectionUtils.filter(result, p -> ((Person) p).getAge() > 30);

        System.out.println(result);
    }
}

```

该代码示例使用 Spring 的`CollectionUtils`创建一个过滤列表，其中包含 30 岁以上的人员。

```java
var result = new ArrayList<>(persons);

```

与 Apache `CollectionUtils`类似，将创建原始列表的副本。 该示例将修改`result`列表。

```java
CollectionUtils.filter(result, p -> ((Person) p).getAge() > 30);

```

`CollectionUtils.filter()`方法使用给定的谓词过滤`result`列表。

```java
[Person{age=34, name=Michael, sex=MALE}, Person{age=47, name=Peter, sex=MALE}]

```

This is the output of the example.

在本教程中，我们使用了六种不同的方法来过滤 Java 列表。

您可能也对以下相关教程感兴趣： [Java `ArrayList`教程](/articles/javaarraylist/)， [Java 比较器和可比对象](/java/comparablecomparator/)， [Java 教程](/lang/java/)， [Java 流过滤器](/java/streamfilter/) ，[用 Java 读取网页](/articles/javareadwebpage/) 或 [Google Guava 简介](/articles/guava/)。

列出 [Java 教程](/all/#java)。