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

Как добавить один элемент в поток

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

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

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

ANDROMEDA 42

1. Обзор

В этой быстрой статье мы рассмотрим, как добавить элемент в поток Java 8 , что не так интуитивно понятно, как добавление элемента в обычную коллекцию.

2. Подготовка

Мы можем легко добавить данный элемент к потоку , вызвав статический поток. метод concat () :

@Test
public void givenStream_whenPrependingObject_thenPrepended() {
Stream<Integer> anStream = Stream.of(1, 2, 3, 4, 5);

Stream<Integer> newStream = Stream.concat(Stream.of(99), anStream);

assertEquals(newStream.findFirst().get(), (Integer) 99);
}

3. Добавление

Точно так же, чтобы добавить элемент в конец потока, нам просто нужно инвертировать аргументы.

Имейте в виду, что потоки могут представлять бесконечные последовательности, поэтому есть сценарии, когда вы никогда не доберетесь до своего нового элемента:

@Test
public void givenStream_whenAppendingObject_thenAppended() {
Stream<String> anStream = Stream.of("a", "b", "c", "d", "e");

Stream<String> newStream = Stream.concat(anStream, Stream.of("A"));

List<String> resultList = newStream.collect(Collectors.toList());

assertEquals(resultList.get(resultList.size() - 1), "A");
}

4. По определенному индексу

Эта операция не полностью поддерживается Stream API, поскольку, по сути , потоки не являются коллекциями и не распознают концепцию индексов .

Итак, чтобы сделать это, нам нужно преобразовать поток в список, затем вставить элемент и, наконец, получить поток из этого нового списка.

Имейте в виду, что это даст вам желаемый результат, но вы также потеряете ленивость Stream , потому что нам нужно использовать его перед вставкой нового элемента.

Давайте создадим служебный метод для выполнения тяжелой работы:

public <T> Stream<T> insertInStream(Stream<T> stream, T elem, int index) {
List<T> result = stream.collect(Collectors.toList());
result.add(index, elem);
return result.stream();
}

Теперь давайте проверим наш код, чтобы убедиться, что все работает как положено:

@Test
public void givenStream_whenInsertingObject_thenInserted() {
Stream<Double> anStream = Stream.of(1.1, 2.2, 3.3);

Stream<Double> newStream = insertInStream(anStream, 9.9, 3);

List<Double> resultList = newStream.collect(Collectors.toList());

assertEquals(resultList.get(3), (Double) 9.9);
}

5. Вывод

В этой короткой статье мы увидели, как добавить один элемент в поток, будь то в начале, в конце или в заданной позиции.

Имейте в виду, что хотя добавление элемента в начало работает для любого потока, добавление его в конец или по определенному индексу работает только для ограниченных потоков.

Как всегда, полный исходный код можно найти на Github .