原文: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
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;}@Overridepublic 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
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 岁以上的人。
for (Person person: persons) {if (person.getAge() > 30) {result.add(person);}}
一个for循环用于遍历人员列表并创建一个新的具有 30 岁以上人员的人员。
[Person{age=34, name=Michael, sex=MALE}, Person{age=47, name=Peter, sex=MALE}]
这是示例的输出。
使用 Java8 流过滤列表
在下一个示例中,我们使用 Java8 流 API 来过滤列表。
com/zetcode/FilterListEx2.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 岁以上的人员。
Predicate<Person> byAge = person -> person.getAge() > 30;
该谓词返回年龄大于三十的元素。
var result = persons.stream().filter(byAge).collect(Collectors.toList());
persons列表用谓词过滤,并生成一个新的结果列表。
使用 Apache CollectionUtils过滤列表
在下一个示例中,我们使用 Apache CollectionUtils过滤数据。 它为Collection实例提供了工具方法和修饰符。
<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
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;}@Overridepublic 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
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 列表。
var result = new ArrayList<>(persons);
将创建列表的新副本。
CollectionUtils.filter(result, o -> ((Person) o).getAge() < 30);
CollectionUtils.filter()通过对每个元素应用谓词来过滤集合。 如果谓词返回false,则删除该元素。
使用 Google Guava 过滤列表
在以下示例中,我们使用 Google Guava 过滤列表。 Google Guava 是 Java 通用库的开源集。
<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>19.0</version></dependency>
对于 Guava 库,我们使用此依赖项。
com/zetcode/Person.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;}@Overridepublic String toString() {return MoreObjects.toStringHelper(Person.class).add("Age", age).add("Name", name).add("Sex", sex).toString();}}
MoreObjects.toStringHelper()用于改进toString()方法。
com/zetcode/FilterListEx4.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);}}
该代码示例过滤列表以仅包含男性。
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()方法在一张照片中创建一个可变列表。
Predicate<Person> byGender = person -> person.getSex() == Gender.MALE;
对于男性,此谓词返回true。
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。
<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
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 岁以下人员的过滤列表。
Predicate<Person> lessThan30 = (Predicate<Person>) person -> person.getAge() < 30;
创建谓词以接受年龄小于 30 的元素。
var result = (List<Person>) Iterate.select(persons, lessThan30);
Iterate.select()返回一个新集合,其中仅包含对于指定谓词求值为true的元素。
使用 Spring 的CollectionUtils过滤列表
在下一个示例中,我们将使用 Spring 的CollectionUtils过滤列表。 它包含其他集合工具方法。
<dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.1.7.RELEASE</version></dependency>
该项目包含 Spring Core JAR 的 Maven 依赖项。
com/zetcode/FilterListEx6.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 岁以上的人员。
var result = new ArrayList<>(persons);
与 Apache CollectionUtils类似,将创建原始列表的副本。 该示例将修改result列表。
CollectionUtils.filter(result, p -> ((Person) p).getAge() > 30);
CollectionUtils.filter()方法使用给定的谓词过滤result列表。
[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 教程。
