Java 8复杂流过滤器和vs或

时间:2018-04-09 17:04:38

标签: java java-stream

我有一个表对象,它有三列我用来过滤事件。

具有假设值的三列:

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())

这表现得像"或"并过滤掉两行。 即如果component == A || event == B || subEvent == C

我真正想要的是

IF(组件== A&& event == B&& subEvent == C)然后过滤掉但保持 其他一切。

我已将我的过滤器修改为

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

但是我冒险丢失其他事件,其中subEvent == C但是Component和Event值与A和B不匹配。

了解有关设置此类复合过滤器的最佳做法的任何其他策略建议。谢谢!

3 个答案:

答案 0 :(得分:2)

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

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

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

表示仅在流中保留尊重这些three条件的元素。

看看这些行:

 Component Event SubEvent
     A       B       C
     A       B       D

第一行的条件为false。所以元素没有保留。 但是第二行的条件也是假的,因为只有当所有条件都为真并且其中两个不成立时,一系列逻辑AND才为真:

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

所以没有人保留这些行。

你应该写的是:

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

答案 1 :(得分:1)

那么为什么不创建首先匹配的过滤器,然后在流过滤器中对行进行否定?这样你就会拒绝与第一行匹配的所有事件,如下所示:

Predicate<Event> FIRST_ROW = event-> 
                 Object.equals(A , event.getComponent()) && 
                 Object.equals(B , event.getEventType() && 
                 Object.equals(C , event.getEventSubType();

save(events.stream()
.filter(FIRST_ROW.negate())
                    .collect(Collectors.toList())

答案 2 :(得分:1)

尝试

save(events.stream().filter(event -> 
         !"A".equals(event.getComponent()) || 
         !"B".equals(event.getEventType()) ||
         !"C".equals(event.getEventSubType())
            .collect(Collectors.toList())

或等效

int main(){
    Board b;
    b.setUp();  //setUp deck and add to tableau arrays
    b.printTab(4); //print the fourth one again
}