在两种类型

时间:2015-07-24 10:50:29

标签: java functional-programming guava predicate

我不确定我是否完全理解番石榴的Predicate<T>应该如何使用。我有两个班级PromotionCustomer,我想查看哪一个促销活动适用于客户。

public Optional<Promotion> getApplicablePromotionToCustomer(final List<Promotion> activePromotions,
                                                                         final Customer customer) {
        return FluentIterable.from(activePromotions).firstMatch(new Predicate<Promotion>() {
            @Override
            public boolean apply(final Promotion input) {
                return input.getCustomerType().equals(customer.getType()) && new DateRangeComparator().overlaps(input.getDateRange(), customer.getDateRange());
            }
        });
    }

我的问题与Predicate的正确输入有关。制作Predicate类型的Promotion是否正确,还是应该使用PromotionCustomer构建包装类?我甚至不确定如何说出来。我使用“PredicateCustomer并将其应用于Promotion”吗? 如果我想将Predicate的匿名实现提取到它自己的类中,我将必须使构造函数采用Customer,如果想要进行自定义,则必须使用DateRangeComparator。这样的罚款或方法是完全错误的吗?

1 个答案:

答案 0 :(得分:3)

  

制作促销类型的谓词是否正确,或者我应该建立一个   包含促销和客户的包装类?

是的,这是对的。您要实施的过滤功能的格式为f(x) = y,其中y属于{false, true}

此处x的类型是您要应用函数的元素的类型(因此Predicate的类型)。由于您过滤了List<Promotion>,谓词的类型将为Predicate<Promotion>。用于测试元素的逻辑(CustomerDateRangeComparator是函数本身,但输入类型肯定是Promotion

  

我是否使用&#34;谓词与客户并将其应用于   推广与#34;

每个人都有自己的措辞,只要你清楚我认为这并不重要。但是,是的,您将谓词应用于Promotion

  

如果我想将Predicate的匿名实现提取到它   我自己的类,我必须让构造函数接受客户,甚至   一个DateRangeComparator,如果想要进行自定义。这很好吗   或方法是完全错误的?

是的,这样做并没有错。我唯一要记住的是你应该尽可能地尝试实现无状态谓词,即一个不保留过滤内容的谓词,这样每个项目都可以独立处理。当您开始进行并行计算时,这非常有用,因为每个必须进行测试的对象都可以将谓词用作独立的&#34;框&#34;。