1. Обзор
В этой краткой статье мы рассмотрим, как добавить элемент в Java 8 Stream , который не так интуитивно понятен, как добавление элемента в обычную коллекцию.
2. Предисловие
Мы можем легко добавить данный элемент в Поток , вызвав статический поток. concat () метод:
@Test public void givenStream_whenPrependingObject_thenPrepended() { StreamanStream = Stream.of(1, 2, 3, 4, 5); Stream newStream = Stream.concat(Stream.of(99), anStream); assertEquals(newStream.findFirst().get(), (Integer) 99); }
3. Добавление
Аналогично, чтобы добавить элемент в конец потока , нам просто нужно инвертировать аргументы.
Имейте в виду, что Потоки могут представлять бесконечные последовательности поэтому существуют сценарии, когда вы никогда не доберетесь до своего нового элемента:
@Test public void givenStream_whenAppendingObject_thenAppended() { StreamanStream = 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. При Определенном Индексе
Эта операция не полностью поддерживается Stream API, поскольку по сути Streams не являются коллекциями и не распознают концепцию индексов .
Итак, чтобы сделать это, нам нужно преобразовать Поток в список, затем вставить элемент и, наконец, получить Поток из этого нового списка.
Имейте в виду, что это даст вам желаемый результат, но вы также потеряете лень потока , потому что нам нужно использовать его перед вставкой нового элемента.
Давайте создадим полезный метод для выполнения тяжелой работы:
publicStream 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() { StreamanStream = 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. Заключение
В этой короткой статье мы рассмотрели, как добавить один элемент в поток, будь то в начале, в конце или в заданной позиции.
Имейте в виду, что, хотя добавление элемента работает для любого потока, добавление его в конец или в определенный индекс работает только для конечных потоков.
Как всегда, полный исходный код можно найти на Github .