Java中如何实现字符串布尔逻辑执行以筛选符合条件的句子?
问题解答
1. 解决if(s)的条件判断问题
sb.contains("is")返回的是boolean类型,你错误地将其赋值给String类型变量s会导致编译错误。正确做法是直接把s声明为boolean类型:
// 正确声明方式 boolean s = sb.contains("is"); if (s) { // do something }
如果因特殊需求必须使用String变量(不推荐),可将字符串转为布尔值后判断(属于冗余操作):
String s = String.valueOf(sb.contains("is")); if (Boolean.parseBoolean(s)) { // do something }
2. 动态布尔逻辑筛选句子的替代实现方式
直接构造字符串表达式并执行(比如用Java的ScriptEngine)虽可行,但存在安全风险(输入不可信时)且性能一般。推荐以下更可靠的方案:
方案一:解析表达式为Predicate组合
将输入的逻辑表达式拆解为基础contains条件,用Java 8+的Predicate接口组合逻辑:
- 把每个关键词转换为
Predicate<String>:Predicate<String> containsStack = s -> s.contains("Stack"); Predicate<String> containsOver = s -> s.contains("over"); Predicate<String> containsIs = s -> s.contains("is"); Predicate<String> containsFlow = s -> s.contains("flow"); - 根据逻辑运算符组合Predicate:
// 对应表达式:Stack & over & (is | flow) Predicate<String> finalCondition = containsStack .and(containsOver) .and(containsIs.or(containsFlow)); - 用该Predicate筛选句子数组:
List<String> sentences = Arrays.asList("Stack over flow", "Stack is over", "Hello world"); List<String> result = sentences.stream() .filter(finalCondition) .collect(Collectors.toList());
方案二:实现轻量表达式解析器
自己编写简单解析器,处理括号、&/|运算符:
- 步骤:先按括号拆分高优先级子表达式,再依次处理
&(与)和|(或),将每个子表达式转为对应的布尔判断。 - 优点:完全可控,无安全风险,性能优于脚本引擎。
方案三:使用规则引擎(适合复杂场景)
若后续逻辑需扩展(如新增运算符、自定义规则),可使用Easy Rules或Drools等成熟规则引擎,通过配置规则实现筛选,但对简单布尔逻辑而言属于“大材小用”。
内容的提问来源于stack exchange,提问作者pika pi
相关产品推荐
相关产品推荐

