Java Stream API 模糊查询终极教程:内存级多条件过滤

本教程将深入剖析基于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 对象列表的多条件过滤功能,包含以下核心特性:

  1. 多条件AND查询:同时过滤类别和名称
  2. 空条件自动忽略:如果查询条件为空,跳过该条件
  3. 内存级模糊查询:使用 contains() 方法实现部分匹配
  4. 空值安全保护:防止 NullPointerException
  5. 纯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

五、总结与适用建议

优势总结

  1. 简单易实现:纯Java无需学习SQL
  2. 灵活条件组合:轻松实现复杂逻辑
  3. 安全无注入风险:内存操作无安全问题
  4. 强类型校验:编译期类型安全
  5. 统一代码风格:保持Java一致性

使用建议

  1. 适合场景:小数据量、复杂业务逻辑、内存计算
  2. 最佳实践
    • 预处理参数(trim+大小写)
    • 提前空条件返回
    • 添加空值保护
    • 考虑使用并行流
  3. 备选方案:大数据集考虑SQL查询

本教程展示了如何在Java应用中高效实现内存级多条件模糊查询。通过这种实现方式,开发者可以避免依赖数据库,快速构建灵活的数据过滤功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我不是少爷.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值