在两种类型上正确使用 guava Predicate

Correct use of guava Predicate on two types

我不确定我是否完全理解 guava 的 Predicate<T> 应该如何使用。我有两个 classes 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 的正确输入有关。制作 Promotion 类型的 Predicate 是正确的还是我应该用 PromotionCustomer 构建一个包装器 class?我什至不知道该怎么说。我是在使用“PredicateCustomer 并将其应用于 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>。用于测试元素的逻辑(CustomerDateRangeComparator 是函数本身,但输入类型肯定是 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".