Пример. Отфильтруйте список продуктов, у которых есть цена на основе значений fromPrice и toPrice. Они могут поставляться либо оба, либо только один.
- Найти все товары, цена которых больше fromPrice
- Найти все товары, цена которых меньше toPrice
- Найти все товары, цена которых находится между fromPrice и toPrice
Товар:
public class Product {
private String id;
private Optional<BigDecimal> price;
public Product(String id, BigDecimal price) {
this.id = id;
this.price = Optional.ofNullable(price);
}
}
Предикат цены:
public class PricePredicate {
public static Predicate<? super Product> isBetween(BigDecimal fromPrice, BigDecimal toPrice) {
if (fromPrice != null && toPrice != null) {
return product -> product.getPrice().isPresent() && product.getPrice().get().compareTo(fromPrice) >= 0 &&
product.getPrice().get().compareTo(toPrice) <= 0;
}
if (fromPrice != null) {
return product -> product.getPrice().isPresent() && product.getPrice().get().compareTo(fromPrice) >= 0;
}
if (toPrice != null) {
return product -> product.getPrice().isPresent() && product.getPrice().get().compareTo(toPrice) <= 0;
}
return null;
}
}
Фильтры:
return this.products.stream().filter(PricePredicate.isBetween(fromPrice, null)).collect(Collectors.toList());
return this.products.stream().filter(PricePredicate.isBetween(null, toPrice)).collect(Collectors.toList());
return this.products.stream().filter(PricePredicate.isBetween(fromPrice, toPrice)).collect(Collectors.toList());
Есть ли способ улучшить мой предикат вместо проверки if not null? Что-нибудь, что можно сделать с опционами?
null
, в любом случае является краеугольным камнем). Таким образом, вы можете заменитьproduct -> true
наproduct -> product.getPrice().isPresent()
и удалитьproduct.getPrice().isPresent() &&
из других предикатов. 14.07.2017