Перейти к основному содержимому

Итерабельность для потоковой передачи в Java

· 2 мин. чтения

Задача: Наибольшая подстрока без повторений

Для заданной строки s, найдите длину наибольшей подстроки без повторяющихся символов. Подстрока — это непрерывная непустая последовательность символов внутри строки...

ANDROMEDA 42

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() определяет, должен ли результирующий поток быть параллельным или последовательным. Вы должны установить его как true для параллельного Stream .

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

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