«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.