本文目录导读:

我来详细说明Java中实现数据过滤的几种常见方式,并附上完整案例。
使用Stream API(Java 8+)
最简单的过滤方式,适合集合数据处理。
import java.util.*;
import java.util.stream.Collectors;
public class StreamFilterDemo {
public static void main(String[] args) {
List<Person> people = Arrays.asList(
new Person("张三", 25, "北京"),
new Person("李四", 30, "上海"),
new Person("王五", 18, "北京"),
new Person("赵六", 35, "广州"),
new Person("钱七", 28, "北京")
);
// 过滤出北京地区且年龄大于20岁的人
List<Person> filtered = people.stream()
.filter(p -> "北京".equals(p.getCity()))
.filter(p -> p.getAge() > 20)
.collect(Collectors.toList());
System.out.println("过滤结果:");
filtered.forEach(System.out::println);
// 多条件过滤:提取年龄在20-30之间的北京人
List<Person> complexFilter = people.stream()
.filter(p -> p.getAge() >= 20 && p.getAge() <= 30)
.filter(p -> "北京".equals(p.getCity()))
.collect(Collectors.toList());
}
}
class Person {
private String name;
private int age;
private String city;
public Person(String name, int age, String city) {
this.name = name;
this.age = age;
this.city = city;
}
// getter和setter
public String getName() { return name; }
public int getAge() { return age; }
public String getCity() { return city; }
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + ", city='" + city + "'}";
}
}
使用Predicate接口(函数式编程)
Predicate提供了更灵活的过滤条件组合。
import java.util.*;
import java.util.function.Predicate;
import java.util.stream.Collectors;
public class PredicateFilterDemo {
public static void main(String[] args) {
List<Product> products = Arrays.asList(
new Product("iPhone", 6999, "电子"),
new Product("Java书", 89, "图书"),
new Product("耳机", 299, "电子"),
new Product("Python书", 79, "图书"),
new Product("电脑", 5999, "电子")
);
// 定义多个Predicate
Predicate<Product> isElectronic = p -> "电子".equals(p.getCategory());
Predicate<Product> isExpensive = p -> p.getPrice() > 500;
Predicate<Product> nameContainsIphone = p -> p.getName().contains("iPhone");
// 组合条件:电子类且价格大于500
Predicate<Product> electronicAndExpensive = isElectronic.and(isExpensive);
// 或者条件:电子类或者价格大于500
Predicate<Product> electronicOrExpensive = isElectronic.or(isExpensive);
// 取反条件:非电子产品
Predicate<Product> notElectronic = isElectronic.negate();
System.out.println("电子类且价格>500:");
filterProducts(products, electronicAndExpensive).forEach(System.out::println);
System.out.println("\n非电子产品:");
filterProducts(products, notElectronic).forEach(System.out::println);
}
public static List<Product> filterProducts(List<Product> products,
Predicate<Product> predicate) {
return products.stream()
.filter(predicate)
.collect(Collectors.toList());
}
}
class Product {
private String name;
private double price;
private String category;
public Product(String name, double price, String category) {
this.name = name;
this.price = price;
this.category = category;
}
// getter
public String getName() { return name; }
public double getPrice() { return price; }
public String getCategory() { return category; }
@Override
public String toString() {
return String.format("Product{name='%s', price=%.2f, category='%s'}",
name, price, category);
}
}
传统循环过滤方式
适合复杂逻辑或需要中断的场景。
import java.util.*;
public class TraditionalFilterDemo {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// 过滤出偶数
List<Integer> evens = filterEvenNumbers(numbers);
System.out.println("偶数:" + evens);
// 复杂条件过滤
List<String> filteredStrings = filterStringsWithComplexLogic();
System.out.println("\n复杂过滤结果:" + filteredStrings);
}
private static List<Integer> filterEvenNumbers(List<Integer> numbers) {
List<Integer> result = new ArrayList<>();
for (Integer num : numbers) {
if (num % 2 == 0) {
result.add(num);
}
}
return result;
}
// 复杂过滤逻辑:包含特定字符且长度大于3
private static List<String> filterStringsWithComplexLogic() {
List<String> strings = Arrays.asList("hello", "world", "hi", "java", "python");
List<String> result = new ArrayList<>();
for (String str : strings) {
if (str.contains("a") || str.contains("o")) {
if (str.length() > 3) {
result.add(str);
}
}
}
return result;
}
}
使用Apache Commons Collections
需要添加依赖:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.4</version>
</dependency>
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.Predicate;
import org.apache.commons.collections4.PredicateUtils;
import java.util.*;
public class ApacheFilterDemo {
public static void main(String[] args) {
List<User> users = new ArrayList<>();
users.add(new User("admin", "管理员", true));
users.add(new User("user1", "普通用户1", false));
users.add(new User("user2", "普通用户2", false));
users.add(new User("test", "测试用户", true));
// 使用Apache Commons过滤
Predicate<User> activePredicate = user -> user.isActive();
Predicate<User> adminPredicate = user -> "admin".equals(user.getUsername());
// 组合条件:活跃用户或者管理员
Predicate<User> combined = PredicateUtils.orPredicate(activePredicate, adminPredicate);
CollectionUtils.filter(users, combined);
System.out.println("过滤后的用户:");
users.forEach(System.out::println);
}
}
class User {
private String username;
private String displayName;
private boolean active;
// 构造函数、getter、setter和toString
public User(String username, String displayName, boolean active) {
this.username = username;
this.displayName = displayName;
this.active = active;
}
public String getUsername() { return username; }
public boolean isActive() { return active; }
@Override
public String toString() {
return String.format("User{username='%s', displayName='%s', active=%s}",
username, displayName, active);
}
}
复合过滤条件实现
多个条件的灵活组合。
import java.util.*;
import java.util.stream.Collectors;
public class ComplexFilterDemo {
public static void main(String[] args) {
List<Order> orders = createOrders();
// 复杂过滤:金额>100的已完成订单,按金额排序
List<Order> filteredOrders = orders.stream()
.filter(o -> o.getAmount() > 100)
.filter(o -> "已完成".equals(o.getStatus()))
.sorted(Comparator.comparingDouble(Order::getAmount).reversed())
.collect(Collectors.toList());
System.out.println("复杂过滤结果:");
filteredOrders.forEach(System.out::println);
// 分组过滤统计
Map<String, List<Order>> statusGroups = orders.stream()
.collect(Collectors.groupingBy(Order::getStatus));
System.out.println("\n按状态分组:");
statusGroups.forEach((status, orderList) -> {
System.out.println(status + ": " + orderList.size() + "条");
});
}
private static List<Order> createOrders() {
return Arrays.asList(
new Order("001", 150.0, "已完成", "张三"),
new Order("002", 50.0, "已取消", "李四"),
new Order("003", 300.0, "已完成", "王五"),
new Order("004", 80.0, "待支付", "赵六"),
new Order("005", 200.0, "已完成", "钱七")
);
}
}
class Order {
private String orderId;
private double amount;
private String status;
private String customer;
public Order(String orderId, double amount, String status, String customer) {
this.orderId = orderId;
this.amount = amount;
this.status = status;
this.customer = customer;
}
// getter
public double getAmount() { return amount; }
public String getStatus() { return status; }
@Override
public String toString() {
return String.format("Order{id='%s', amount=%.2f, status='%s', customer='%s'}",
orderId, amount, status, customer);
}
}
推荐使用Stream API + Predicate的组合方式,原因如下:
- 代码简洁:一行代码完成过滤
- 可读性强:链式调用清晰表达意图
- 易于组合:Predicate可以灵活组合
- 性能优化:支持并行处理(
parallelStream()) - 函数式编程:符合现代Java编程范式
建议根据实际场景选择合适的方式:
- 简单过滤:Stream API
- 复杂条件组合:Predicate
- 需要中断循环:传统方式
- 大数据量:考虑并行流或数据库查询