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

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

1. обзор

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

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

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

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

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

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

3. Добавление данных

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

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

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

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

    List resultList = newStream.collect(Collectors.toList());

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

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

Эта операция не полностью поддерживается APIStream, потому что по существуStreams are not collections and do not recognize the concept of indexes.

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

Имейте в виду, что это даст вам желаемый результат, но вы также получитеlose the laziness of a Stream because we need to consume it before inserting a new element.

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

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

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

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

    Stream newStream = insertInStream(anStream, 9.9, 3);

    List resultList = newStream.collect(Collectors.toList());

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

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

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

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

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