Como adicionar um único elemento a um fluxo

Como adicionar um único elemento a um fluxo

1. Visão geral

Neste artigo rápido, vamos dar uma olhada em comoadd an element to a Java 8 Stream, que não é tão intuitivo quanto adicionar um elemento a uma coleção normal.

2. Anexar

Podemos facilmente acrescentar um determinado elemento aStream invocando o método estáticoStream.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. Anexar

Da mesma forma, para anexar um elemento ao final deStream,, precisamos apenas inverter os argumentos.

Lembre-se de queStreams can represent infinite sequences, portanto, há cenários em que você pode nunca chegar ao seu novo elemento:

@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. Em um índice específico

Esta operação não é totalmente suportada pela APIStream porque essencialmenteStreams are not collections and do not recognize the concept of indexes.

Então, para fazer isso, precisamos converterStream em uma lista, inserir o elemento e, finalmente, obter umStream dessa nova lista.

Lembre-se de que isso lhe dará o resultado desejado, mas você tambémlose the laziness of a Stream because we need to consume it before inserting a new element.

Vamos criar um método utilitário para fazer o trabalho pesado:

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

Agora, vamos testar nosso código para garantir que tudo esteja funcionando conforme o esperado:

@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. Conclusão

Neste breve artigo, vimos como adicionar um único elemento a umStream,, seja no início, no final ou em uma determinada posição.

Lembre-se de que, embora prefixar um elemento funcione para qualquerStream,, adicioná-lo ao final ou a um índice específico funciona apenas para fluxos finitos.

Como sempre, o código-fonte completo pode ser encontradoover on Github.