Отримання Елементів зі Стріму за Допомогою findFirst() та findAny()
Свайпніть щоб показати меню
У Stream API також можна витягти лише один відповідний елемент з усього потоку.
Наприклад, в інтернет-магазині можна шукати перший товар зі знижкою або будь-який товар у наявності. У таких випадках методи findFirst та findAny є корисними, оскільки дозволяють швидко отримати елемент з потоку даних.
Метод findFirst()
Метод findFirst() використовується для отримання першого елемента у потоці. Це особливо корисно, коли має значення порядок елементів, наприклад, при роботі з упорядкованим потоком.
Optional<T> findFirst();
Цей метод повертає Optional<T>, тобто елемент може бути знайдений, а може й ні.
Приклад використання
В інтернет-магазині потрібно знайти перший товар зі знижкою та вивести його назву:
Main.java
12345678910111213141516171819202122232425262728293031323334353637383940package com.example; import java.util.List; import java.util.Optional; import java.util.Arrays; public class Main { public static void main(String[] args) { List<Product> products = Arrays.asList( new Product("Laptop", false), new Product("Smartphone", true), new Product("Tablet", true) ); Optional<Product> discountedProduct = products.parallelStream() .filter(Product::hasDiscount) .findFirst(); discountedProduct.ifPresent(product -> System.out.println("Discounted product: " + product.getName())); } } class Product { private String name; private boolean discount; public Product(String name, boolean discount) { this.name = name; this.discount = discount; } public boolean hasDiscount() { return discount; } public String getName() { return name; } }
Код створює список об'єктів Product, кожен з яких має поле discount. Метод filter(Product::hasDiscount) вибирає лише товари зі знижкою, а findFirst() отримує перший з них. Якщо товар знайдено, виводиться його назва.
Метод findAny()
Метод findAny() отримує будь-який елемент зі стріму. Особливо корисний при паралельній обробці, оскільки може повернути перший доступний елемент, що іноді швидше за findFirst().
Optional<T> findAny();
Як і findFirst(), цей метод повертає Optional<T>, що допомагає уникнути проблем із null.
Приклад використання
Знайдемо будь-який доступний продукт і виведемо його назву:
Main.java
123456789101112131415161718192021222324252627282930313233343536373839404142package com.example; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Optional; import java.util.stream.Stream; public class Main { public static void main(String[] args) { List<Product> products = Arrays.asList( new Product("Laptop", false), new Product("Smartphone", true), new Product("Tablet", true) ); Optional<Product> availableProduct = products.parallelStream() .filter(Product::hasDiscount) .findAny(); availableProduct.ifPresent(product -> System.out.println("Product found: " + product.getName())); } } class Product { private String name; private boolean discount; public Product(String name, boolean discount) { this.name = name; this.discount = discount; } public boolean hasDiscount() { return discount; } public String getName() { return name; } }
Цей код створює список products, що містить об'єкти Product з полем discount. Метод filter(Product::hasDiscount) відбирає лише товари зі знижкою, а findAny() вибирає випадковий. Якщо товар знайдено, виводиться його назва.
1. Що повертає метод findFirst() у Stream API?
2. У чому основна різниця між findAny() та findFirst()?
3. Який метод є кращим для продуктивності у паралельних потоках?
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат