Java 8 流 : find items from one list that match conditions calculated based on values from another list

标签 java java-8 java-stream

有两个类和两个对应的列表:

class Click {
   long campaignId;
   Date date;
}

class Campaign {
   long campaignId;
   Date start;
   Date end;
   String type;
}

List<Click> clicks = ..;
List<Campaign> campaigns = ..;

并希望在 clicks 中找到所有 Click :

  1. campaigns 列表中有相应的 Campaign,即 Campaign 具有相同的 campaignId 并且

  2. Activity type = "prospective"AND

  3. 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());

我想知道是否有更简单的解决方案。

最佳答案

好吧,IMO 有一种非常巧妙的方法可以解决您的问题,这是 Holger 的原创想法(我会找到问题并将其链接到此处)。

您可以定义执行检查的方法(我稍微简化了它):

static boolean checkClick(List<Campaign> campaigns, Click click) {
    return campaigns.stream().anyMatch(camp -> camp.getCampaignId() 
               == click.getCampaignId());
}

并定义一个绑定(bind)参数的函数:

public static <T, U> Predicate<U> bind(BiFunction<T, U, Boolean> f, T t) {
    return u -> f.apply(t, u);
}

用法是:

BiFunction<List<Campaign>, Click, Boolean> biFunction = YourClass::checkClick;
Predicate<Click> predicate = bind(biFunction, campaigns);

clicks.stream()
      .filter(predicate::test)
      .collect(Collectors.toList());

关于Java 8 流 : find items from one list that match conditions calculated based on values from another list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45397570/

相关文章:

java - 使用 Java 流将对象映射到多个对象

java - 在 Java 8 Stream 上执行操作时如何保留状态?

Java 8 Generic 的 Generic for Monad Transformer

java - 如何使用 lambda 来过滤 Java 中的 boolean 数组

java - Collection.stream() 是否有内部同步?

java - 用于多个标签的 JScrollPane

java - 映射集合 ('select *' ) 到 MyBatis 中的字段

java - 通用表模型

java - 将 HTTP Get 请求解析为组成字段

java - 无与伦比的类型 : int and Number in java 8