当前位置: 首页 > news >正文

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]]

关键说明

  1. filter()方法

    接收 Predicate函数(返回 boolean 的 Lambda)

    .filter(element -> /* 返回 true 的元素会被保留 */)
  2. Java 21 新特性

    • 可直接用 toList()替代 Collectors.toList()

    • 支持 record类型简化数据类(如示例 3)

  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);}
}

根据您的实际需求:

  1. 替换 originalList为您的数据源

  2. filter()中编写具体条件

  3. 结果将存储在 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();

复杂条件处理技巧:

  1. 提前返回​:在方法中使用卫语句减少嵌套

private boolean validateItem(Item item) {if (item.isInvalid()) return false; // 快速失败if (item.isSpecial()) return true;   // 快速通过// 复杂主逻辑return mainValidation(item);
}
  1. 使用工具类​:封装复杂计算

.filter(item -> ValidationUtils.isComplexValid(item, config))
  1. 模式匹配(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组合

http://www.dtcms.com/a/409791.html

相关文章:

  • Session共享问题
  • 3. Ollama 安装,流式输出,多模态,思考模型
  • Go基础:常用数学函数处理(主要是math包rand包的处理)
  • 做彩票网站被捉将受到什么惩罚北京网站建设公司制作网站
  • 沈阳小程序建设兰州seo优化
  • 低疲劳高响应!硬件软件协同:明基 RD280U 赋能创作开发,解锁新工位高效工作氛围
  • Apache Log4j2 lookup JNDI 注入漏洞(CVE-2021-44228)
  • wpf之 Popup
  • @xyflow/react:构建交互式节点流程图的完整指南
  • LinuxC++项目开发日志——基于正倒排索引的boost搜索引擎(5——通过cpp-httplib库建立网页模块)
  • 消息队列Apache Kafka教程
  • Hadess入门到实战(3) - 如何管理Npm制品
  • 【AI算法工程师的一些子路】音频大模型从入门到精通:算法工程师的成长之路
  • 透明的多级并发(行) 方式
  • 音乐网站还可以做做seo网站的公司哪家好
  • 【python3】Streamlit快速构建前端页面
  • ​FAQ: 如何在 WPF 项目中强制指定统一输出目录并确保 VS 调试正常?
  • mysql数据库学习之数据查询进阶操作(三)
  • 虚拟机下 Ubuntu 20.04 + Kubernetes 安装步骤
  • Docker nginx容器部署前端项目。
  • 基于WebAssembly的STEP文件3D在线查看器实现详解
  • 流量对网站排名的影响因素社交网站建设平台
  • 微软 Azure AI 视频翻译服务助力 JowoAI 实现短剧高效出海
  • Kotlin协程 -> Deferred.await() 完整流程图与核心源码分析
  • java-File
  • 【uniapp】uniapp+uview-ui+mixins实现搜索+上拉加载+加载动画功能:
  • 信息产业部icp备案中心网站南通网站建设南通
  • 如何把pdf转换的excell多个表格合并
  • 5 种使用 Python 自动化处理 PDF 的实用方法
  • 专业电子商务网站建设东莞网站建设兼职