Java 8 如何基于字符串列表拼接查询条件实现优雅代码写法
Java 8 优雅实现方案
直接上可运行的优化后代码:
import java.util.Map; import java.util.stream.Collectors; // 原有基础查询语句 String query = "select device, manufacturer, type from devices where username = ?"; // 定义设备类型和对应查询条件的映射关系,后续新增类型仅需维护此映射 Map<String, String> typeConditionMapping = Map.of( "typeA", "type like 'A%'", "typeB", "type like 'B%'" ); // 流式遍历设备类型,收集所有符合的查询条件 String conditionPart = deviceTypes.stream() .filter(typeConditionMapping::containsKey) .map(typeConditionMapping::get) .distinct() // 避免列表中重复类型导致重复拼接条件 .collect(Collectors.joining(" OR ")); // 存在有效条件时才拼接 if (!conditionPart.isBlank()) { query += " AND " + conditionPart; }
方案优势
- 完全覆盖原有需求:同时存在A、B时自动用OR拼接,仅存在单个类型时直接拼接对应条件,无匹配类型时不新增任何条件
- 移除了冗余的
found标志位和多层分支判断,逻辑更简洁直观 - 仅遍历一次
deviceTypes集合,性能优于原代码的两次流遍历 - 扩展性极强,后续新增其他类型匹配规则,仅需要在
typeConditionMapping中新增键值对即可,无需修改核心逻辑 - 避免了多段零散的字符串拼接操作,代码可读性大幅提升
注意事项
如果你的实际场景中like后的匹配值是动态传入的,建议不要直接拼接字符串,改用预编译参数的方式避免SQL注入风险,仅需调整映射逻辑收集参数列表即可。
内容的提问来源于stack exchange,提问作者user7469506
相关产品推荐
相关产品推荐

