Java 8 Stream复杂过滤:And/Or逻辑使用不当导致结果不符
修正Stream过滤逻辑,实现目标事件过滤
嘿,我一眼就看出你这过滤逻辑的问题啦!咱们先理清楚需求:要移除的是Component=A、Event=B、SubEvent=C的那条数据,剩下的都保留对吧?
你的原代码用了A != event.getComponent() && B != event.getEventType() && C != event.getEventSubType(),这个逻辑完全搞反了——它要求事件的三个属性必须同时不等于A、B、C才会被保留,那第二行(A,B,D)因为Component等于A,第一个条件不成立,整个表达式就为false,自然会被过滤掉,这就和你要的结果相反了。
正确的过滤逻辑应该是这样的:
我们需要排除的是同时满足三个属性匹配的那条数据,所以应该用取反的逻辑:判断当前事件「不是(Component=A 且 Event=B 且 SubEvent=C)」。
另外要注意,字符串比较一定要用equals()而不是!=(假设A、B、C是字符串类型),不然会因为引用比较出问题。如果怕空指针,还可以用Objects.equals()来做安全比较。
修正后的代码示例:
return events -> save(events.stream() .filter(event -> !(A.equals(event.getComponent()) && B.equals(event.getEventType()) && C.equals(event.getEventSubType()))) .collect(Collectors.toList()));
更安全的空指针版本(用Objects.equals):
import java.util.Objects; // ... return events -> save(events.stream() .filter(event -> !(Objects.equals(A, event.getComponent()) && Objects.equals(B, event.getEventType()) && Objects.equals(C, event.getEventSubType()))) .collect(Collectors.toList()));
这样一来,只有同时匹配A、B、C的那条数据会被过滤掉,第二行(A,B,D)就会被正确保留下来啦!
内容的提问来源于stack exchange,提问作者mba12
相关产品推荐
相关产品推荐

