Дослідження Predicate в Java 8 на реальних прикладах

Оскільки функції Java 8 часто запитуються на співбесідах, я вирішив написати про них. Ви завжди можете звертатися до списку літератури за цим посиланням. Окрім того, я зазначив приклади коду, пов’язані з цим.

Java 8 представила пакет java.util.function, який привніс низку функціональних інтерфейсів для підтримки функціонального програмування. Серед них інтерфейс Predicate є потужним інструментом для оцінки умов та фільтрації даних.

Predicate — це функціональний інтерфейс, який приймає один аргумент і повертає значення типу boolean. Зазвичай він використовується в сценаріях, коли потрібно перевірити об'єкт за певною умовою. Інтерфейс має один абстрактний метод:

boolean test(T t);

Використання Predicate спрощує код, дозволяючи розробникам виражати умови як лямбда-вирази.
Наприклад, розглянемо список цілих чисел, де потрібно відфільтрувати парні числа:

List numbers = Arrays.asList(1, 2, 3, 4, 5);  
numbers.stream()  
 .filter(n -> n % 2 == 0)  
 .forEach(System.out::println);

Тепер ми розглянемо, як Predicate можна використовувати з класом Product для ефективної фільтрації даних.
Давайте розглянемо практичні приклади на основі класу Product з десятьма полями.

Опис класу Product

Ось клас Product, з яким ми будемо працювати:

class Product {  
 private int id;  
 private String name;  
 private String category;  
 private double price;  
 private String brand;  
 private String manufacturer;  
 private int stockQuantity;  
 private boolean isAvailable;  
 private double weight;  
 private String description;  

 public Product(int id, String name, String category, double price, String brand, String manufacturer,  
 int stockQuantity, boolean isAvailable, double weight, String description) {  
 this.id = id;  
 this.name = name;  
 this.category = category;  
 this.price = price;  
 this.brand = brand;  
 this.manufacturer = manufacturer;  
 this.stockQuantity = stockQuantity;  
 this.isAvailable = isAvailable;  
 this.weight = weight;  
 this.description = description;  
 }  

 public int getId() {  
 return id;  
 }  

 public String getName() {  
 return name;  
 }  

 public String getCategory() {  
 return category;  
 }  

 public double getPrice() {  
 return price;  
 }  

 public String getBrand() {  
 return brand;  
 }  

 public String getManufacturer() {  
 return manufacturer;  
 }  

 public int getStockQuantity() {  
 return stockQuantity;  
 }  

 public boolean isAvailable() {  
 return isAvailable;  
 }  

 public double getWeight() {  
 return weight;  
 }  

 public String getDescription() {  
 return description;  
 }  

 @Override  
 public String toString() {  
 return "Product{" +  
 "id=" + id +  
 ", name='" + name + '\'' +  
 ", category='" + category + '\'' +  
 ", price=" + price +  
 ", brand='" + brand + '\'' +  
 ", manufacturer='" + manufacturer + '\'' +  
 ", stockQuantity=" + stockQuantity +  
 ", isAvailable=" + isAvailable +  
 ", weight=" + weight +  
 ", description='" + description + '\'' +  
 '}';  
 }  
}

Використання: Фільтрація продуктів за допомогою Predicate

Тепер створимо список об'єктів Product і використаємо Predicate для фільтрації їх на основі різних умов.

1.

Фільтрація продуктів за ціною

Predicate priceGreaterThan500 = product -> product.getPrice() > 500;  
List expensiveProducts = productList.stream()  
 .filter(priceGreaterThan500)  
 .collect(Collectors.toList());

Це фільтрує продукти, ціна яких перевищує 500.

2. Фільтрація продуктів за категорією

Predicate categoryFilter = product -> "Category3".equals(product.getCategory());  
List category3Products = productList.stream()  
 .filter(categoryFilter)  
 .collect(Collectors.toList());

Це фільтрує продукти в категорії “Category3”.

3. Фільтрація доступних продуктів

Predicate isAvailable = Product::isAvailable;  
List availableProducts = productList.stream()  
 .filter(isAvailable)  
 .collect(Collectors.toList());

Це фільтрує доступні продукти.

4.

Фільтрація за брендом

Predicate brandFilter = product -> "Brand1".equals(product.getBrand());  
List brand1Products = productList.stream()  
 .filter(brandFilter)  
 .collect(Collectors.toList());

Це фільтрує продукти з брендом “Brand1”.

5. Фільтрація за кількістю на складі

Predicate stockFilter = product -> product.getStockQuantity() > 20;  
List highStockProducts = productList.stream()  
 .filter(stockFilter)  
 .collect(Collectors.toList());

Це фільтрує продукти з кількістю на складі більше ніж 20.

6. Фільтрація продуктів за діапазоном ваги

Predicate weightRangeFilter = product -> product.getWeight() >= 1.0 && product.getWeight() <= 3.0;  
List mediumWeightProducts = productList.stream()  
 .filter(weightRangeFilter)  
 .collect(Collectors.toList());

Це фільтрує продукти з вагою від 1.0 до 3.0.

7.

Фільтрація продуктів за наявністю слова в описі

Predicate descriptionContains = product -> product.getDescription().contains("specific word");  
List matchingDescriptionProducts = productList.stream()  
 .filter(descriptionContains)  
 .collect(Collectors.toList());

Це фільтрує продукти, у описі яких є слово "specific word".

8. Об'єднання предикатів для складної фільтрації

Predicate categoryAndPriceFilter = product -> "Category2".equals(product.getCategory()) && product.getPrice() < 300;  
List filteredProducts = productList.stream()  
 .filter(categoryAndPriceFilter)  
 .collect(Collectors.toList());

Це фільтрує продукти категорії “Category2” з ціною менше 300.

9.

Ігнорування предиката

Predicate notAvailable = Predicate.not(Product::isAvailable);  
List unavailableProducts = productList.stream()  
 .filter(notAvailable)  
 .collect(Collectors.toList());

Це фільтрує продукти, які недоступні.

10. Фільтрація за кількома умовами

Predicate complexFilter = product -> "Category4".equals(product.getCategory()) &&  
 product.getPrice() > 400 &&  
 product.getStockQuantity() < 30;  
List complexFilteredProducts = productList.stream()  
 .filter(complexFilter)  
 .collect(Collectors.toList());

Це фільтрує продукти, що належать до категорії “Category4”, мають ціну більше 400 і кількість на складі менше 30.

Висновок

Predicate в Java 8 спрощує умовну фільтрацію колекцій, таких як List, використовуючи лямбда-вирази та посилання на методи. У цьому блозі ми розглянули різні випадки використання Predicate з класом Product.
Спробуйте експериментувати з цими прикладами, щоб отримати практичний досвід у функціональному програмуванні в Java 8!

Перекладено з: Exploring Java 8 Predicate with Real-world Examples

Leave a Reply

Your email address will not be published. Required fields are marked *