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 + "}";
}
}