jdk21 list中筛选出符合条件的list
在 Java 21 中,使用 Stream API 筛选列表是最简洁高效的方式。以下是通用解决方案及示例:
通用代码模板
import java.util.List;
import java.util.stream.Collectors;List<T> filteredList = originalList.stream().filter(element -> /* 你的筛选条件 */).collect(Collectors.toList());
示例场景
1. 筛选数值列表(如大于 10 的整数)
List<Integer> numbers = List.of(5, 12, 8, 15, 3, 20);
List<Integer> result = numbers.stream().filter(n -> n > 10).toList(); // Java 16+ 可直接用 toList()// 结果: [12, 15, 20]
2. 筛选字符串列表(如包含 "java" 的字符串)
List<String> langs = List.of("java", "python", "javascript", "c++");
List<String> result = langs.stream().filter(s -> s.contains("java")).toList();// 结果: ["java", "javascript"]
3. 筛选对象列表(如年龄 ≥ 18 的用户)
record User(String name, int age) {}List<User> users = List.of(new User("Alice", 25),new User("Bob", 17),new User("Charlie", 30)
);List<User> result = users.stream().filter(user -> user.age() >= 18).toList();// 结果: [User[name=Alice, age=25], User[name=Charlie, age=30]]
关键说明
filter()
方法接收
Predicate
函数(返回 boolean 的 Lambda).filter(element -> /* 返回 true 的元素会被保留 */)
Java 21 新特性
可直接用
toList()
替代Collectors.toList()
支持
record
类型简化数据类(如示例 3)
多条件筛选
用逻辑运算符组合条件:
// 筛选 18-30 岁的用户 .filter(user -> user.age() >= 18 && user.age() <= 30)
完整示例代码
import java.util.List;public class FilterDemo {public static void main(String[] args) {// 示例:筛选包含 "J" 且长度 > 4 的字符串List<String> data = List.of("Java", "Kotlin", "Scala", "C++", "JavaScript");List<String> result = data.stream().filter(s -> s.contains("J") && s.length() > 4).toList(); // ["JavaScript"]System.out.println(result);}
}
根据您的实际需求:
替换
originalList
为您的数据源在
filter()
中编写具体条件结果将存储在
filteredList
中
当筛选条件复杂时,可以通过以下方法优雅地处理:
方法 1:使用多条件组合(推荐)
List<ResultType> result = list.stream().filter(item -> condition1(item) && (condition2(item) || condition3(item)) &&!condition4(item)).toList();
方法 2:提取复杂逻辑为独立方法
List<ResultType> result = list.stream().filter(this::complexCondition).toList();// 单独定义复杂条件方法
private boolean complexCondition(ItemType item) {// 多步骤计算var calcResult = calculateSomething(item);// 嵌套条件判断if (item.propertyA() > threshold) {return checkSubCondition(item) && (item.subProperty() != null || hasDefaultBehavior(item));} else {return validateAlternative(item, calcResult);}
}
方法 3:使用 Predicate 组合
// 定义原子条件
Predicate<ItemType> cond1 = item -> item.getValue() > 100;
Predicate<ItemType> cond2 = item -> item.getName().contains("重要");
Predicate<ItemType> cond3 = item -> !item.getTags().isEmpty();// 组合复杂条件
Predicate<ItemType> complexCond = cond1.and(cond2.or(item -> item.isSpecialCase())).negate().or(cond3);List<ResultType> result = list.stream().filter(complexCond).toList();
方法 4:临时变量法(适合单次筛选)
List<ResultType> result = list.stream().filter(item -> {// 计算中间值var tempValue = item.getBase() * item.getFactor();var status = item.getStatus();// 多分支条件if (status == Status.ACTIVE) {return tempValue > MIN_ACTIVE && item.getHistory().size() > 3;} else if (status == Status.PENDING) {return item.getCreateTime().isAfter(LocalDate.now().minusDays(7));} else {return tempValue != 0 && validateThirdParty(item);}}).toList();
复杂条件处理技巧:
提前返回:在方法中使用卫语句减少嵌套
private boolean validateItem(Item item) {if (item.isInvalid()) return false; // 快速失败if (item.isSpecial()) return true; // 快速通过// 复杂主逻辑return mainValidation(item);
}
使用工具类:封装复杂计算
.filter(item -> ValidationUtils.isComplexValid(item, config))
模式匹配(Java 21+):
.filter(item -> switch(item) {case SpecialItem s -> s.getPriority() > 5;case NormalItem n -> n.getValue() > 100 && n.isValid();case default -> false;
})
完整示例:电商订单筛选
record Order(String id, double amount, LocalDate date, Customer customer, List<Item> items) {}List<Order> filteredOrders = orders.stream().filter(order -> {// 条件1:金额大于1000或VIP客户boolean isHighValue = order.amount() > 1000;boolean isVip = order.customer().isVip();// 条件2:最近30天的订单boolean isRecent = order.date().isAfter(LocalDate.now().minusDays(30));// 条件3:包含特定商品boolean containsSpecialItem = order.items().stream().anyMatch(item -> item.sku().equals("SPECIAL_123"));// 组合条件:(高价值或VIP) 且 (是近期订单或含特殊商品)return (isHighValue || isVip) && (isRecent || containsSpecialItem);}).toList();
调试技巧:
.peek(item -> {if (complexCondition(item)) System.out.println("通过: " + item); // 调试输出
})
根据实际需求选择最合适的方式:
简单条件:直接组合
中等复杂度:临时变量法
高度复杂:提取独立方法
可复用逻辑:Predicate组合