Оскільки функції 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