Лямбди, Stream API та Optional у тестах
Лямбда — короткий запис реалізації функціонального інтерфейсу (інтерфейсу з одним абстрактним методом). Найчастіші:
Predicate<T>— приймає значення, повертаєboolean(filter);Function<T,R>— перетворює значення (map);Consumer<T>— приймає, нічого не повертає (forEach);Supplier<T>— нічого не приймає, повертає значення (orElseGet);Runnable,Callable<V>— дія без аргументів.
Посилання на метод скорочує лямбду: WebElement::getText замість e -> e.getText(). Лямбда бачить лише effectively final локальні змінні, тому лічильник у ній змінити не вдасться (використайте AtomicInteger чи count()).
Очікування в Selenium теж лямбда: wait.until(d -> d.findElement(By.id("ready")).isDisplayed()), бо ExpectedCondition<T> розширює Function<WebDriver, T>.
List<String> titles = rows.stream()
.filter(WebElement::isDisplayed)
.map(WebElement::getText)
.filter(t -> !t.isBlank())
.toList(); // Java 16+, незмінний список
Stream — конвеєр: джерело → проміжні операції (filter, map, sorted, distinct), які ледачі й нічого не роблять, → термінальна операція (toList, collect, count, anyMatch, findFirst, forEach), що запускає обчислення. Стрім можна використати лише раз. Типові задачі: перевірити, що список відсортований, що всі елементи відповідають умові (allMatch), згрупувати (Collectors.groupingBy). Уникайте parallelStream() у тестах із спільним драйвером чи станом.
Optional — контейнер «значення може бути відсутнє» для результату методу (findFirst). Витягуйте через orElseThrow() із зрозумілим повідомленням, orElse, orElseGet, ifPresent. get() без перевірки кидає NoSuchElementException. Не використовуйте Optional як поле чи параметр.