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

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

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

在所有六个示例中,我们将过滤人员列表。 Person是具有三个属性的 Java 类:agenamesex

使用 Java for循环过滤列表

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

com/zetcode/Person.java

  1. package com.zetcode;
  2. enum Gender {
  3. MALE, FEMALE
  4. }
  5. public class Person {
  6. private int age;
  7. private String name;
  8. private Gender sex;
  9. public Person(int age, String name, Gender sex) {
  10. this.age = age;
  11. this.name = name;
  12. this.sex = sex;
  13. }
  14. public int getAge() {
  15. return age;
  16. }
  17. public void setAge(int age) {
  18. this.age = age;
  19. }
  20. public String getName() {
  21. return name;
  22. }
  23. public void setName(String name) {
  24. this.name = name;
  25. }
  26. public Gender getSex() {
  27. return sex;
  28. }
  29. public void setSex(Gender sex) {
  30. this.sex = sex;
  31. }
  32. @Override
  33. public String toString() {
  34. final StringBuilder sb = new StringBuilder("Person{");
  35. sb.append("age=").append(age);
  36. sb.append(", name='").append(name).append('\'');
  37. sb.append(", sex=").append(sex);
  38. sb.append('}');
  39. return sb.toString();
  40. }
  41. }

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

com/zetcode/FilterListEx.java

  1. package com.zetcode;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. public class FilterListEx {
  5. public static void main(String[] args) {
  6. var p1 = new Person(34, "Michael", Gender.MALE);
  7. var p2 = new Person(17, "Jane", Gender.FEMALE);
  8. var p3 = new Person(28, "John", Gender.MALE);
  9. var p4 = new Person(47, "Peter", Gender.MALE);
  10. var p5 = new Person(27, "Lucy", Gender.FEMALE);
  11. var persons = List.of(p1, p2, p3, p4, p5);
  12. var result = new ArrayList<Person>();
  13. for (Person person: persons) {
  14. if (person.getAge() > 30) {
  15. result.add(person);
  16. }
  17. }
  18. System.out.println(result);
  19. }
  20. }

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

  1. for (Person person: persons) {
  2. if (person.getAge() > 30) {
  3. result.add(person);
  4. }
  5. }

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

  1. [Person{age=34, name=Michael, sex=MALE}, Person{age=47, name=Peter, sex=MALE}]

这是示例的输出。

使用 Java8 流过滤列表

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

com/zetcode/FilterListEx2.java

  1. package com.zetcode;
  2. import java.util.List;
  3. import java.util.function.Predicate;
  4. import java.util.stream.Collectors;
  5. public class FilterListEx2 {
  6. public static void main(String[] args) {
  7. var p1 = new Person(34, "Michael", Gender.MALE);
  8. var p2 = new Person(17, "Jane", Gender.FEMALE);
  9. var p3 = new Person(28, "John", Gender.MALE);
  10. var p4 = new Person(47, "Peter", Gender.MALE);
  11. var p5 = new Person(27, "Lucy", Gender.FEMALE);
  12. var persons = List.of(p1, p2, p3, p4, p5);
  13. Predicate<Person> byAge = person -> person.getAge() > 30;
  14. var result = persons.stream().filter(byAge)
  15. .collect(Collectors.toList());
  16. System.out.println(result);
  17. }
  18. }

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

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

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

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

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

使用 Apache CollectionUtils过滤列表

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

  1. <dependency>
  2. <groupId>commons-collections</groupId>
  3. <artifactId>commons-collections</artifactId>
  4. <version>3.2.2</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>commons-lang</groupId>
  8. <artifactId>commons-lang</artifactId>
  9. <version>2.6</version>
  10. </dependency>

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

com/zetcode/Person.java

  1. package com.zetcode;
  2. import org.apache.commons.lang.builder.ToStringBuilder;
  3. enum Gender {
  4. MALE, FEMALE
  5. }
  6. public class Person {
  7. private int age;
  8. private String name;
  9. private Gender sex;
  10. public Person(int age, String name, Gender sex) {
  11. this.age = age;
  12. this.name = name;
  13. this.sex = sex;
  14. }
  15. public int getAge() {
  16. return age;
  17. }
  18. public void setAge(int age) {
  19. this.age = age;
  20. }
  21. public String getName() {
  22. return name;
  23. }
  24. public void setName(String name) {
  25. this.name = name;
  26. }
  27. public Gender getSex() {
  28. return sex;
  29. }
  30. public void setSex(Gender sex) {
  31. this.sex = sex;
  32. }
  33. @Override
  34. public String toString() {
  35. return new ToStringBuilder(Person.class).
  36. append("Age", age).
  37. append("Name", name).
  38. append("Sex", sex).
  39. toString();
  40. }
  41. }

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

com/zetcode/FilterListEx3.java

  1. package com.zetcode;
  2. import org.apache.commons.collections.CollectionUtils;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. public class FilterListEx3 {
  6. public static void main(String[] args) {
  7. var p1 = new Person(34, "Michael", Gender.MALE);
  8. var p2 = new Person(17, "Jane", Gender.FEMALE);
  9. var p3 = new Person(28, "John", Gender.MALE);
  10. var p4 = new Person(47, "Peter", Gender.MALE);
  11. var p5 = new Person(27, "Lucy", Gender.FEMALE);
  12. var persons = List.of(p1, p2, p3, p4, p5);
  13. var result = new ArrayList<>(persons);
  14. CollectionUtils.filter(result, o -> ((Person) o).getAge() < 30);
  15. System.out.println(result);
  16. }
  17. }

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

  1. var result = new ArrayList<>(persons);

将创建列表的新副本。

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

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

使用 Google Guava 过滤列表

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

  1. <dependency>
  2. <groupId>com.google.guava</groupId>
  3. <artifactId>guava</artifactId>
  4. <version>19.0</version>
  5. </dependency>

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

com/zetcode/Person.java

  1. package com.zetcode;
  2. import com.google.common.base.MoreObjects;
  3. enum Gender {
  4. MALE, FEMALE
  5. }
  6. public class Person {
  7. private int age;
  8. private String name;
  9. private Gender sex;
  10. public Person(int age, String name, Gender sex) {
  11. this.age = age;
  12. this.name = name;
  13. this.sex = sex;
  14. }
  15. public int getAge() {
  16. return age;
  17. }
  18. public void setAge(int age) {
  19. this.age = age;
  20. }
  21. public String getName() {
  22. return name;
  23. }
  24. public void setName(String name) {
  25. this.name = name;
  26. }
  27. public Gender getSex() {
  28. return sex;
  29. }
  30. public void setSex(Gender sex) {
  31. this.sex = sex;
  32. }
  33. @Override
  34. public String toString() {
  35. return MoreObjects.toStringHelper(Person.class)
  36. .add("Age", age)
  37. .add("Name", name)
  38. .add("Sex", sex)
  39. .toString();
  40. }
  41. }

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

com/zetcode/FilterListEx4.java

  1. package com.zetcode;
  2. import com.google.common.base.Predicate;
  3. import com.google.common.collect.FluentIterable;
  4. import com.google.common.collect.Lists;
  5. public class FilterListEx4 {
  6. public static void main(String[] args) {
  7. var persons = Lists.newArrayList(
  8. new Person(34, "Michael", Gender.MALE),
  9. new Person(17, "Jane", Gender.FEMALE),
  10. new Person(28, "John", Gender.MALE),
  11. new Person(47, "Peter", Gender.MALE),
  12. new Person(27, "Lucy", Gender.FEMALE)
  13. );
  14. Predicate<Person> byGender = person -> person.getSex() == Gender.MALE;
  15. var results = FluentIterable.from(persons)
  16. .filter(byGender)
  17. .toList();
  18. System.out.println(results);
  19. }
  20. }

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

  1. var persons = Lists.newArrayList(
  2. new Person(34, "Michael", Gender.MALE),
  3. new Person(17, "Jane", Gender.FEMALE),
  4. new Person(28, "John", Gender.MALE),
  5. new Person(47, "Peter", Gender.MALE),
  6. new Person(27, "Lucy", Gender.FEMALE)
  7. );

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

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

对于男性,此谓词返回true

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

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

使用 Eclipse 集合过滤列表

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

Eclipse 集合是 Java 的集合框架。 它具有与 JDK 兼容的ListSetMap实现,并具有丰富的 API,在 JDK 中找不到的其他类型(例如BagsMultimaps)以及与所有与 JDK 兼容的任何工具CollectionsArraysMapsStrings

  1. <dependency>
  2. <groupId>org.eclipse.collections</groupId>
  3. <artifactId>eclipse-collections-api</artifactId>
  4. <version>7.1.0</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.eclipse.collections</groupId>
  8. <artifactId>eclipse-collections</artifactId>
  9. <version>7.1.0</version>
  10. </dependency>

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

com/zetcode/FilterListEx5.java

  1. package com.zetcode;
  2. import org.eclipse.collections.api.block.predicate.Predicate;
  3. import org.eclipse.collections.impl.factory.Lists;
  4. import org.eclipse.collections.impl.utility.Iterate;
  5. import java.util.List;
  6. public class FilterListEx5 {
  7. public static void main(String[] args) {
  8. var persons = Lists.immutable.of(
  9. new Person(34, "Michael", Gender.MALE),
  10. new Person(17, "Jane", Gender.FEMALE),
  11. new Person(28, "John", Gender.MALE),
  12. new Person(47, "Peter", Gender.MALE),
  13. new Person(27, "Lucy", Gender.FEMALE)
  14. );
  15. Predicate<Person> lessThan30 = (Predicate<Person>) person -> person.getAge() < 30;
  16. var result = (List<Person>) Iterate.select(persons, lessThan30);
  17. System.out.println(result);
  18. }
  19. }

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

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

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

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

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

使用 Spring 的CollectionUtils过滤列表

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

  1. <dependency>
  2. <groupId>org.springframework</groupId>
  3. <artifactId>spring-core</artifactId>
  4. <version>5.1.7.RELEASE</version>
  5. </dependency>

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

com/zetcode/FilterListEx6.java

  1. package com.zetcode;
  2. import org.springframework.cglib.core.CollectionUtils;
  3. import java.util.ArrayList;
  4. import java.util.Arrays;
  5. public class FilterListEx6 {
  6. public static void main(String[] args) {
  7. var p1 = new Person(34, "Michael", Gender.MALE);
  8. var p2 = new Person(17, "Jane", Gender.FEMALE);
  9. var p3 = new Person(28, "John", Gender.MALE);
  10. var p4 = new Person(47, "Peter", Gender.MALE);
  11. var p5 = new Person(27, "Lucy", Gender.FEMALE);
  12. var persons = Arrays.asList(p1, p2, p3, p4, p5);
  13. var result = new ArrayList<>(persons);
  14. CollectionUtils.filter(result, p -> ((Person) p).getAge() > 30);
  15. System.out.println(result);
  16. }
  17. }

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

  1. var result = new ArrayList<>(persons);

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

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

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

  1. [Person{age=34, name=Michael, sex=MALE}, Person{age=47, name=Peter, sex=MALE}]

This is the output of the example.

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

您可能也对以下相关教程感兴趣: Java ArrayList教程Java 比较器和可比对象Java 教程Java 流过滤器用 Java 读取网页Google Guava 简介

列出 Java 教程