多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 用 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)。