Использовал ли Stream API и операцию reduce при написании тестов или тестовых утилит на Java?

«Использовал ли Stream API и операцию reduce при написании тестов или тестовых утилит на Java?» — вопрос из категории Java, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, использовал reduce в Stream API для агрегации данных в тестовых сценариях, например, для подготовки тестовых данных или анализа результатов.

Практический пример из тестирования: Допустим, нужно проверить, что общая сумма стоимости всех товаров в корзине рассчитывается корректно.

@Test
void calculateTotalCartPrice_ShouldReturnCorrectSum() {
    // Arrange: Создаем список тестовых товаров
    List<Item> testItems = Arrays.asList(
        new Item("Книга", 500.0),
        new Item("Мышь", 2500.0),
        new Item("Клавиатура", 3500.0)
    );

    // Act: Используем reduce для вычисления суммы цен
    double expectedTotal = testItems.stream()
        .map(Item::getPrice)          // Преобразуем поток товаров в поток цен
        .reduce(0.0, Double::sum);    // Суммируем, начиная с 0.0
    // Double::sum - это сокращение для (a, b) -> a + b

    // Assert: Сравниваем с результатом метода корзины
    ShoppingCart cart = new ShoppingCart(testItems);
    assertEquals(expectedTotal, cart.calculateTotalPrice(), 0.01);
}

Важные нюансы операции reduce:

  • Первый аргумент (identity) – начальное значение аккумулятора. Для пустого потока будет возвращено именно оно.
  • Операция должна быть ассоциативной, чтобы ее можно было безопасно распараллеливать (parallelStream()).
  • Часто для простого суммирования или конкатенации удобнее использовать специализированные коллекторы, например, Collectors.summingDouble().