有兩個類和兩個相應的清單:的Java 8流:找到基於從另一個列表中值匹配計算條件的一個列表項
class Click {
long campaignId;
Date date;
}
class Campaign {
long campaignId;
Date start;
Date end;
String type;
}
List<Click> clicks = ..;
List<Campaign> campaigns = ..;
,並希望找到所有Click
S IN clicks
是:
有相應的
Campaign
在campaigns
列表,即Campaign
具有相同campaignId
和這
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());
我想知道問題是否有更簡單的解決方案。
我認爲你真正需要做的就是將更大的lambda提取到一個命名方法中。 –
@JoeC這真的有可能嗎?這個lambda是指點擊和廣告系列,這意味着我將需要使用BiPredicate,而過濾器接受Predicate –
'點擊 - > checkCampaigns(點擊,廣告系列)' –