«1. Обзор

В этом кратком руководстве давайте преобразуем объект Java Iterable в поток и выполним над ним некоторые стандартные операции.

2. Преобразование Iterable в Stream

Интерфейс Iterable разработан с учетом универсальности и не предоставляет никакого метода stream() сам по себе.

Проще говоря, вы можете передать его методу StreamSupport.stream() и получить Stream из данного экземпляра Iterable.

Давайте рассмотрим наш экземпляр Iterable:

Iterable<String> iterable 
  = Arrays.asList("Testing", "Iterable", "conversion", "to", "Stream");

И вот как мы можем преобразовать этот экземпляр Iterable в Stream:

StreamSupport.stream(iterable.spliterator(), false);

Обратите внимание, что второй параметр в StreamSupport.stream() определяет, будет ли результирующий Stream должны быть параллельными или последовательными. Вы должны установить это значение true для параллельного потока.

Теперь давайте проверим нашу реализацию:

@Test
public void givenIterable_whenConvertedToStream_thenNotNull() {
    Iterable<String> iterable 
      = Arrays.asList("Testing", "Iterable", "conversion", "to", "Stream");

    Assert.assertNotNull(StreamSupport.stream(iterable.spliterator(), false));
}

Также небольшое замечание: потоки нельзя использовать повторно, а Iterable можно; он также предоставляет метод spliterator(), который возвращает экземпляр java.lang.Spliterator для элементов, описанных данным Iterable.

3. Выполнение операции с потоком

Давайте выполним простую операцию с потоком:

@Test
public void whenConvertedToList_thenCorrect() {
    Iterable<String> iterable 
      = Arrays.asList("Testing", "Iterable", "conversion", "to", "Stream");

    List<String> result = StreamSupport.stream(iterable.spliterator(), false)
      .map(String::toUpperCase)
      .collect(Collectors.toList());

    assertThat(
      result, contains("TESTING", "ITERABLE", "CONVERSION", "TO", "STREAM"));
}

4. Заключение

В этом простом руководстве показано, как можно преобразовать экземпляр Iterable в экземпляр Stream и выполнить стандартные операции над точно так же, как вы сделали бы это для любого другого экземпляра Collection.

Реализацию всех фрагментов кода можно найти в проекте Github.