2015-07-24 5 views
0

Я не уверен, полностью ли я понимаю, как использовать guava's Predicate<T>. У меня есть два класса Promotion и Customer, и я хочу проверить, какая из рекламных акций применима к клиенту.Правильное использование guava Predicate на двух типах

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

Правильно ли сделать предикат типа Promotion или я должен построить класс обертки с промотированием и клиентом?

Да, это правильно. Функция фильтрации, которую вы хотите реализовать, будет иметь вид f(x) = y, где y относится к {false, true}.

Здесь тип x является типом элемента, на котором вы хотите применить функцию (так что тип Predicate). Поскольку вы фильтруете List<Promotion>, тип предиката будет Predicate<Promotion>. Логика, используемая для проверки элемента (с Customer и DateRangeComparator является сама функция, но тип входа определенно Promotion там.

Могу ли я с помощью «предиката с Клиентом и применяя его к Promotion» ?

Каждый человек имеет свою собственную формулировку, до тех пор, как вы ясно, что я думаю, что это на самом деле не имеет значения. Но да, вы применить предикат к Promotion.

Если я хочу извлечь анонимную реализацию Predicate для своего собственного класса, я должен будет сделать конструктор брать клиента и даже DateRangeComparator, если вы хотите сделать это настраиваемым. Это прекрасно или подход совершенно не так?

Да, нет ничего плохого в этом. Единственное, что я хотел бы иметь в виду, это то, что вы должны попытаться реализовать предикат без сохранения состояния, когда это возможно, т. Е. Предикат, который не сохраняет то, что он фильтровал, чтобы каждый элемент обрабатывался независимо. Это очень полезно, когда вы начинаете выполнять параллельные вычисления, потому что каждый объект, который должен быть протестирован, может использовать предикат как автономный «ящик».