我不确定我是否完全理解应使用番石榴的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。这种罚款或方法完全错误吗?

最佳答案

使谓词类型为Promotion是否正确,还是我应该建立一个
  促销和客户包装类?


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

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


  我是否在使用“与客户的谓词并将其应用于
  促销”?


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


  如果我想提取Predicate的匿名实现,
  自己的类,我必须让构造函数接受一个Customer,甚至
  DateRangeComparator(如果要使其可自定义)。这样好吗
  或方法是完全错误的?


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

09-26 17:04