本教程将深入剖析基于Java Stream API的集合过滤操作,演示如何实现高效的多条件模糊查询功能。以下是我们将要详细解析的代码:
List<FoodInfo> filteredList = all.stream()
.filter(food ->
(type == null || type.isEmpty() ||
(food.getType() != null && food.getType().contains(type)))
&&
(name == null || name.isEmpty() ||
(food.getName() != null && food.getName().contains(name)))
)
.collect(Collectors.toList());
一、核心功能解析
这段代码实现了对 FoodInfo
对象列表的多条件过滤功能,包含以下核心特性:
- 多条件AND查询:同时过滤类别和名称
- 空条件自动忽略:如果查询条件为空,跳过该条件
- 内存级模糊查询:使用
contains()
方法实现部分匹配 - 空值安全保护:防止
NullPointerException
- 纯Java实现:不依赖数据库或外部框架
二、分步代码解析
1. Stream管道初始化
List<FoodInfo> filteredList = all.stream()
all.stream()
:将集合转换为 Stream 对象,准备进行流式处理- 起点为包含所有食物的
all
集合
2. filter() 方法 - 核心过滤逻辑
.filter(food -> 过滤条件)
filter()
:保留满足条件的元素- 每个
FoodInfo
对象依次被检查
3. 类别过滤条件
(type == null || type.isEmpty() ||
(food.getType() != null && food.getType().contains(type)))
条件逻辑分解:
条件 | 解释 | 结果 |
---|---|---|
type == null | 没有类别查询条件 | 直接满足(TRUE) |
type.isEmpty() | 类别条件为空字符串 | 直接满足(TRUE) |
food.getType() != null | 食物类别有值 | 避免NPE |
food.getType().contains(type) | 类别包含查询关键词 | 实际匹配条件 |
组合逻辑:如果类别条件不为空,则进行模糊匹配;否则自动满足条件
4. 名称过滤条件
(name == null || name.isEmpty() ||
(food.getName() != null && food.getName().contains(name)))
结构同类别条件,形成AND关系的双层过滤
5. 结果收集
.collect(Collectors.toList());
collect()
:结束流操作Collectors.toList()
:将过滤结果收集到新列表filteredList
:最终过滤结果
三、逻辑分析:真值表
类别条件状态分析:
输入条件 | 食物类别 | 结果 | 说明 |
---|---|---|---|
null | 水果 | ✅ | 无条件则满足 |
“” | 水果 | ✅ | 空条件满足 |
“水” | 水果 | ✅ | 匹配成功 |
“果” | 水果 | ✅ | 匹配成功 |
“肉” | 水果 | ❌ | 匹配失败 |
“水” | null | ❌ | 空值保护 |
完整条件组合:
类别条件 | 名称条件 | 结果 |
---|---|---|
不设置 | 不设置 | 全部通过 |
设置 | 不设置 | 仅类别匹配 |
不设置 | 设置 | 仅名称匹配 |
设置 | 设置 | 两者都匹配 |
四、与 SQL 语句的对比
特性 | Stream API过滤 | SQL模糊查询 |
---|---|---|
执行位置 | 应用内存 | 数据库服务器 |
数据量 | 中小数据集 | 大数据集 |
灵活性 | 复杂业务逻辑 | 标准SQL语法 |
性能 | 取决于JVM | 数据库优化 |
实时性 | 实时过滤 | 实时/近实时 |
开发速度 | 快速实现 | 需写SQL |
五、总结与适用建议
优势总结
- 简单易实现:纯Java无需学习SQL
- 灵活条件组合:轻松实现复杂逻辑
- 安全无注入风险:内存操作无安全问题
- 强类型校验:编译期类型安全
- 统一代码风格:保持Java一致性
使用建议
- 适合场景:小数据量、复杂业务逻辑、内存计算
- 最佳实践:
- 预处理参数(trim+大小写)
- 提前空条件返回
- 添加空值保护
- 考虑使用并行流
- 备选方案:大数据集考虑SQL查询
本教程展示了如何在Java应用中高效实现内存级多条件模糊查询。通过这种实现方式,开发者可以避免依赖数据库,快速构建灵活的数据过滤功能。