Java 8复杂流过滤器And vs Or

MBA12

我有一个表对象,该对象具有用于过滤事件的三列。

具有假设值的三列:

Component Event SubEvent
    A       B       C
    A       B       D

我正在尝试创建一个事件流,该事件流过滤掉第一行而不是第二行。我已经尝试了几种不同的方法来获得不同的结果。

return events -> save(events.stream().filter(event -> 
                 A != event.getComponent() && 
                 B != event.getEventType() && 
                 C != event.getEventSubType())
                    .collect(Collectors.toList())

这就像一个“或”,并过滤出两行。即如果分量== A || 事件== B || subEvent == C

我真正想要的是

IF(组件== A &&事件== B && subEvent == C)然后过滤掉,但保留其他所有内容。

我已将过滤器修改为

.filter(event -> C != event.getEventSubType())

但是我冒着错过其他事件的风险,其中subEvent == C,但是Component和Event值与A和B不匹配。

赞赏有关最佳实践的任何其他策略建议,以建立这种复合筛选器。谢谢!

大卫xxx

请注意,skip(1)允许跳过流的第一个元素。

关于您的问题,您的实际过滤器:

filter(event -> 
         A != event.getComponent() && 
         B != event.getEventType() && 
         C != event.getEventSubType())

表示仅将符合这些three条件的元素保留在流中

看这些行:

组件事件子事件
     ABC 
     ABD

第一行的条件为假。因此不保留该元素。但是第二行的条件也为假,因为一系列逻辑与的条件为真,仅当所有条件都为真且其中两个条件都不为真时:

         A != event.getComponent()   --> false
         B != event.getEventType()   --> false
         C != event.getEventSubType() -->  true

因此,这些线中没有一个被保留。

您应该写的是:

filter(event -> 
         !(A == event.getComponent() && 
           B == event.getEventType() && 
           C == event.getEventSubType()))

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章