突出的一件事是您的第二个要求与匹配无关,这只是一个条件
campaigns。您必须测试这是否对您更好:
clicks.stream() .filter(click -> campaigns.stream() .filter(camp -> "prospecting".equals(camp.type)) .anyMatch(camp -> camp.campaignId == click.campaignId && camp.end.after(click.date) && camp.start.before(click.date) ) ) .collect(Collectors.toList());
否则,我从未见过不涉及在第一个谓词内部流式传输第二个集合的流解决方案,因此您做不到的事不会比您做的更好。在可读性方面,如果您感到困惑,则创建一个测试布尔条件的方法并调用它:
clicks.stream() .filter(click -> campaigns.stream() .filter(camp -> "pre".equals(camp.type)) .anyMatch(camp -> accept(camp, click)) ) .collect(Collectors.toList());static boolean accept(Campaign camp, Click click) { return camp.campaignId == click.campaignId && camp.end.after(click.date) && camp.start.before(click.date);}
最后,有2条无关的建议:
- 不要使用旧的
Date
类,而要使用新的java.time API的LocalDate。 - 如果
Campaign
的type
只能有一些预定义的值(如‘提交’,‘探矿’,‘接受’…),那么enum
会比一般更适合String
。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)