1、使用filter()进行过滤筛选数据
使用 Stream
和 filter()
方法,可以方便地对 List<T>
进行过滤筛选。在过滤时,可以想要记录被筛选的值。
import java.util.List; import java.util.ArrayList; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { // 创建一个 Person 对象的列表 List<Person> persons = new ArrayList<>(); persons.add(new Person("John", 25)); persons.add(new Person("Alice", 30)); persons.add(new Person("Bob", 35)); persons.add(new Person("John", 40)); persons.add(new Person("Charlie", 28)); // 过滤掉名字为 "John" 的 Person 对象,并打印名字为 "John" 的对象 List<Person> filtered = persons.stream() .filter(p -> { if (!"John".equals(p.getName())) { return true; } else { System.out.println("被过滤的名字: " + p.getName()); return false; } }) .collect(Collectors.toList()); // 输出过滤后的列表 System.out.println("过滤后的列表: " + filtered); } } class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } @Override public String toString() { return "Person{name='" + name + "', age=" + age + "}"; } }
或
import java.util.Arrays; import java.util.List; import java.util.function.Predicate; import java.util.stream.Collectors; public class Main { // 包装器方法:记录被过滤掉的值 private static <T> Predicate<T> andLogFilteredOutValues(Predicate<T> predicate) { return value -> { if (predicate.test(value)) { return true; } else { System.out.println("被过滤掉的值: " + value); return false; } }; } public static void main(String[] args) { // 创建一个 Person 类对象的列表 List<Person> persons = Arrays.asList(new Person("John"), new Person("Paul")); // 使用流过滤掉名字为 "John" 的 Person 对象,并记录被过滤的对象 List<Person> filtered = persons.stream() // 使用包装器 .filter(andLogFilteredOutValues(p -> !"John".equals(p.getName()))) .collect(Collectors.toList()); // 输出过滤后的列表 System.out.println("过滤后的列表: " + filtered); } } // Person 类 class Person { private String name; public Person(String name) { this.name = name; } public String getName() { return name; } @Override public String toString() { return "Person{name='" + name + "'}"; } }
2、collect()和Collectors.partitioningBy()进行过滤筛选数据
使用Stream
结合filter
方法进行列表数据的筛选,并使用collect
和Collectors.partitioningBy
进行数据分组和收集操作。
import java.util.List; import java.util.ArrayList; import java.util.Map; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { // 创建一个 Person 对象的列表 List<Person> persons = new ArrayList<>(); persons.add(new Person("John", 25)); persons.add(new Person("Alice", 30)); persons.add(new Person("Bob", 35)); persons.add(new Person("John", 40)); persons.add(new Person("Charlie", 28)); // 使用 partitioningBy 将名字为 "John" 的分为一组 Map<Boolean, List<Person>> map = persons.stream() .collect(Collectors.partitioningBy(p -> "John".equals(p.getName()))); // 打印名字为 "John" 的对象 System.out.println("filtered (名字为 'John' 的): " + map.get(true)); // 获取名字不为 "John" 的对象列表 List<Person> result = map.get(false); // 打印名字不为 "John" 的对象列表 System.out.println("result (名字不为 'John' 的): " + result); } } class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } @Override public String toString() { return "Person{name='" + name + "', age=" + age + "}"; } }
或
import java.util.List; import java.util.ArrayList; import java.util.Map; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { // 创建一个 Person 对象的列表 List<Person> persons = new ArrayList<>(); persons.add(new Person("John", 25)); persons.add(new Person("Alice", 30)); persons.add(new Person("Bob", 35)); persons.add(new Person("John", 40)); persons.add(new Person("Charlie", 28)); // 使用 partitioningBy 将列表分成两部分:名字为 "John" 和不是 "John" List<Person> result = persons.stream() .collect(Collectors.collectingAndThen( Collectors.partitioningBy(p -> "John".equals(p.getName())), map -> { // 输出名字为 "John" 的部分 System.out.println("filtered: " + map.get(true)); // 返回名字不是 "John" 的部分 return map.get(false); } )); // 输出过滤后的列表 System.out.println("过滤后的列表: " + result); } } class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } @Override public String toString() { return "Person{name='" + name + "', age=" + age + "}"; } }