我有一个表对象,它有三列我用来过滤事件。
具有假设值的三列:
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不匹配。
了解有关设置此类复合过滤器的最佳做法的任何其他策略建议。谢谢!
答案 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
}