Ответ
В контексте автоматизации тестирования на Java (например, с JUnit 5, Selenium, RestAssured) нововведения Java 8 значительно упрощают и улучшают читаемость кода.
1. Лямбда-выражения и Stream API для работы с коллекциями тестовых данных:
Это, пожалуй, самое полезное. Вместо циклов for можно использовать цепочки Stream-операций для фильтрации, преобразования и проверки данных.
// Допустим, мы получаем список элементов из таблицы веб-страницы
List<WebElement> rows = driver.findElements(By.cssSelector("table tr"));
// Старый способ (до Java 8):
List<String> names = new ArrayList<>();
for (WebElement row : rows) {
names.add(row.findElement(By.cssSelector(".name")).getText());
}
// Новый способ с Stream API и лямбдами:
List<String> names = rows.stream()
.map(row -> row.findElement(By.cssSelector(".name")).getText())
.collect(Collectors.toList());
// Проверка с помощью AssertJ (который отлично работает с лямбдами):
assertThat(names)
.hasSize(10)
.allMatch(name -> !name.isEmpty()) // Все имена не пустые
.contains("Test User");
2. Функциональные интерфейсы и Optional для безопасной работы с nullable-значениями:
Многие методы Selenium (например, findElement) могут вернуть null или бросить исключение. Optional делает обработку таких случаев явной.
// Поиск элемента, который может отсутствовать
Optional<WebElement> modal = driver.findElements(By.id("popup")).stream().findFirst();
// Если модальное окно есть — закрываем его
modal.ifPresent(elem -> elem.findElement(By.className("close-btn")).click());
// Нет необходимости в проверке if (modal != null) ...
3. java.time API для работы с датами и временем в тестах:
Незаменим для тестов, связанных с таймерами, расписаниями или валидацией дат.
// Проверка, что дата в системе соответствует ожидаемой (с допуском)
LocalDateTime actualTime = parseDateTimeFromUI(driver.findElement(...).getText());
LocalDateTime expectedTime = LocalDateTime.now().minusMinutes(5);
assertThat(actualTime)
.isCloseTo(expectedTime, within(1, ChronoUnit.MINUTES)); // AssertJ
4. Аннотация @FunctionalInterface и кастомные условия ожидания:
Позволяет легко создавать свои ExpectedConditions для Selenium в функциональном стиле.
Wait<WebElement> wait = new FluentWait<>(element)
.withTimeout(Duration.ofSeconds(10))
.pollingEvery(Duration.ofMillis(500))
.ignoring(StaleElementReferenceException.class);
// Ожидание по кастомному условию через лямбду
boolean isReady = wait.until(elem -> {
String classAttr = elem.getAttribute("class");
return classAttr != null && classAttr.contains("loaded");
});
Эти инструменты делают код автотестов более декларативным, лаконичным и устойчивым к ошибкам.