有两个类和两个对应的列表:
class Click {
long campaignId;
Date date;
}
class Campaign {
long campaignId;
Date start;
Date end;
String type;
}
List<Click> clicks = ..;
List<Campaign> campaigns = ..;
并希望在 --- 中找到所有 Click
clicks
:
有一个
campaignId
Campaign
Campaign
campaigns
这个
Campaign
有type
=“预期”和这个
Campaigns.start
<click.date
<Campaigns.end
到目前为止,我有以下实现(这对我来说似乎令人困惑和复杂):
clicks.
stream().
filter(click -> campaigns.stream().anyMatch(
campaign -> campaign.getCampaignType().equals("prospecting") &&
campaign.getCampaignId().equals(click.getCampaignId()) &&
campaign.getStart().after(click.getDate()) &&
campaign.getEnd().before(click.getDate()))).
collect(toList());
我想知道是否有更简单的解决方案来解决这个问题。
原文由 Andrey Yaskulsky 发布,翻译遵循 CC BY-SA 4.0 许可协议
突出的一件事是您的第二个要求与匹配无关,它只是
campaigns
的条件。您必须测试这是否对您更好:否则,我从来没有见过不涉及在第一个谓词中流式传输第二个集合的流解决方案,所以你不能做得比你所做的更好。在可读性方面,如果它看起来让您感到困惑,那么创建一个方法来测试布尔条件并调用它:
最后,2个不相关的建议:
Date
类,而是使用新的 java.time API 的 LocalDate 。Campaign
的type
只能有一些预定义的值(如“已提交”、“勘探”、“已接受”…)然后enum
比一般的String
更合适。