QA Interview Hub · База знань · Тести

Java: основи

Лямбди й Stream API

Лямбди, 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 як поле чи параметр.