在两种类型上正确使用 guava Predicate
Correct use of guava Predicate on two types
我不确定我是否完全理解 guava 的 Predicate<T>
应该如何使用。我有两个 classes 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
的正确输入有关。制作 Promotion
类型的 Predicate
是正确的还是我应该用 Promotion
和 Customer
构建一个包装器 class?我什至不知道该怎么说。我是在使用“Predicate
和 Customer
并将其应用于 Promotion
”吗?
如果我想将 Predicate
的匿名实现提取到它自己的 class,我将不得不让构造函数采用 Customer
,如果想要的话甚至是 DateRangeComparator
使其可定制。这种方法好还是完全错误?
Is it correct to make Predicate of type Promotion or should I build a
wrapper class with Promotion and Customer?
是的,没错。您要实现的过滤功能将采用 f(x) = y
形式,其中 y
属于 {false, true}
。
此处 x
的类型是您要应用该函数的元素的类型(因此 Predicate
的类型)。由于您筛选了 List<Promotion>
,因此谓词的类型将为 Predicate<Promotion>
。用于测试元素的逻辑(Customer
和 DateRangeComparator
是函数本身,但输入类型肯定是 Promotion
。
Am I using a "Predicate with a Customer and applying it to a
Promotion"?
每个人都有自己的写法,只要你清楚我觉得无所谓。但是,是的,您将谓词应用于 Promotion
。
If I want to extract the anonymous implementation of Predicate to it's
own class, I'll have to make the constructor take a Customer, and even
a DateRangeComparator if want to make that customizable. Is this fine
or approach is totally wrong?
是的,这样做没有错。我唯一要记住的是,您应该尽可能尝试实现无状态谓词,即不保留过滤内容的谓词,以便可以独立处理每个项目。这在您开始进行并行计算时非常有用,因为每个需要测试的对象都可以将谓词用作独立的 "box".
我不确定我是否完全理解 guava 的 Predicate<T>
应该如何使用。我有两个 classes 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
的正确输入有关。制作 Promotion
类型的 Predicate
是正确的还是我应该用 Promotion
和 Customer
构建一个包装器 class?我什至不知道该怎么说。我是在使用“Predicate
和 Customer
并将其应用于 Promotion
”吗?
如果我想将 Predicate
的匿名实现提取到它自己的 class,我将不得不让构造函数采用 Customer
,如果想要的话甚至是 DateRangeComparator
使其可定制。这种方法好还是完全错误?
Is it correct to make Predicate of type Promotion or should I build a wrapper class with Promotion and Customer?
是的,没错。您要实现的过滤功能将采用 f(x) = y
形式,其中 y
属于 {false, true}
。
此处 x
的类型是您要应用该函数的元素的类型(因此 Predicate
的类型)。由于您筛选了 List<Promotion>
,因此谓词的类型将为 Predicate<Promotion>
。用于测试元素的逻辑(Customer
和 DateRangeComparator
是函数本身,但输入类型肯定是 Promotion
。
Am I using a "Predicate with a Customer and applying it to a Promotion"?
每个人都有自己的写法,只要你清楚我觉得无所谓。但是,是的,您将谓词应用于 Promotion
。
If I want to extract the anonymous implementation of Predicate to it's own class, I'll have to make the constructor take a Customer, and even a DateRangeComparator if want to make that customizable. Is this fine or approach is totally wrong?
是的,这样做没有错。我唯一要记住的是,您应该尽可能尝试实现无状态谓词,即不保留过滤内容的谓词,以便可以独立处理每个项目。这在您开始进行并行计算时非常有用,因为每个需要测试的对象都可以将谓词用作独立的 "box".