我不确定我是否完全理解番石榴的Predicate<T>
应该如何使用。我有两个班级Promotion
和Customer
,我想查看哪一个促销活动适用于客户。
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
是否正确,还是应该使用Promotion
和Customer
构建包装类?我甚至不确定如何说出来。我使用“Predicate
与Customer
并将其应用于Promotion
”吗?
如果我想将Predicate
的匿名实现提取到它自己的类中,我将必须使构造函数采用Customer
,如果想要进行自定义,则必须使用DateRangeComparator
。这样的罚款或方法是完全错误的吗?
答案 0 :(得分:3)
制作促销类型的谓词是否正确,或者我应该建立一个 包含促销和客户的包装类?
是的,这是对的。您要实施的过滤功能的格式为f(x) = y
,其中y
属于{false, true}
。
此处x
的类型是您要应用函数的元素的类型(因此Predicate
的类型)。由于您过滤了List<Promotion>
,谓词的类型将为Predicate<Promotion>
。用于测试元素的逻辑(Customer
和DateRangeComparator
是函数本身,但输入类型肯定是Promotion
。
我是否使用&#34;谓词与客户并将其应用于 推广与#34;
每个人都有自己的措辞,只要你清楚我认为这并不重要。但是,是的,您将谓词应用于Promotion
。
如果我想将Predicate的匿名实现提取到它 我自己的类,我必须让构造函数接受客户,甚至 一个DateRangeComparator,如果想要进行自定义。这很好吗 或方法是完全错误的?
是的,这样做并没有错。我唯一要记住的是你应该尽可能地尝试实现无状态谓词,即一个不保留过滤内容的谓词,这样每个项目都可以独立处理。当您开始进行并行计算时,这非常有用,因为每个必须进行测试的对象都可以将谓词用作独立的&#34;框&#34;。