我不确定我是否完全理解应使用番石榴的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
。这种罚款或方法完全错误吗? 最佳答案
使谓词类型为Promotion是否正确,还是我应该建立一个
促销和客户包装类?
是的,这是正确的。您要实现的过滤功能的格式为f(x) = y
,其中y
属于{false, true}
。
在这里,x
的类型是要在其上应用该函数的元素的类型(因此Predicate
的类型)。由于您过滤了List<Promotion>
,因此谓词的类型将为Predicate<Promotion>
。用于测试元素的逻辑(使用Customer
和DateRangeComparator
是函数本身,但是输入类型肯定是Promotion
)。
我是否在使用“与客户的谓词并将其应用于
促销”?
每个人都有自己的措词,只要您清楚我认为这并不重要。但是是的,您将谓词应用于Promotion
。
如果我想提取Predicate的匿名实现,
自己的类,我必须让构造函数接受一个Customer,甚至
DateRangeComparator(如果要使其可自定义)。这样好吗
或方法是完全错误的?
是的,这样做没有错。我要记住的唯一一件事是,您应尽可能尝试实现无状态谓词,即,一个谓词不保留所过滤的内容,以便可以独立处理每个项目。当您开始进行并行计算时,这非常有用,因为必须测试的每个对象都可以将谓词用作独立的“盒子”。