В Java Stream API, сколько раз выполнится HTTP GET запрос внутри потока?

«В Java Stream API, сколько раз выполнится HTTP GET запрос внутри потока?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Ответ: Количество вызовов равно количеству элементов потока, которые проходят через операцию, выполняющую запрос (например, map), при условии выполнения терминальной операции.

Объяснение: Stream API сам по себе не выполняет HTTP-запросы. Запросы происходят только в функциях, явно написанных разработчиком (например, внутри map() или forEach()).

Пример:

List<String> urls = List.of("https://api.example.com/1",
                             "https://api.example.com/2",
                             "https://api.example.com/3");

// GET запрос выполнится 3 раза (по одному на каждый URL)
List<Response> responses = urls.stream()
        .map(url -> httpClient.send(getRequest(url))) // Операция, выполняющая запрос
        .collect(Collectors.toList()); // Терминальная операция, запускающая обработку

Важные замечания:

  • Ленивые вычисления: Если терминальная операция не будет вызвана или обработает не все элементы (например, findFirst()), запросы выполнятся только для необходимых элементов.
  • Параллельные стримы (parallelStream()): Запросы могут выполняться одновременно в нескольких потоках, но их общее количество останется равным количеству обработанных элементов.