concat

Emite perezosamente todo el primer iterable y, a continuación, todo el segundo.

Iterable<A> concat<A>(Iterable<A> iterable1, Iterable<A> iterable2) FxAsyncIterable<A> concatAsync<A>(FxAsyncIterable<A> iterable1, FxAsyncIterable<A> iterable2) Fx<T> Fx.concat(Iterable<T> other) // chain FxAsync<T> FxAsync.concat(FxAsyncIterable<T> other)

Lección

concat encadena dos iterables uno detrás de otro sin copiar ninguno de los dos a una lista nueva. Es totalmente perezoso por ambos lados: el segundo iterable ni se toca mientras el pipeline no tire de valores más allá del final del primero — así que concatenar una primera fuente costosa o infinita con una segunda es seguro siempre que no pidas más de lo que tiene la primera.

concatAsync es transparente, igual que las primas asíncronas de take y concat: no serializa ninguno de los dos lados internamente, así que un concurrent(n) aguas abajo sigue pudiendo solapar las peticiones contra el lado que esté activo en ese momento.

Demo 1 · Fundamentos & pereza

El segundo iterable es un generador con un efecto secundario — fíjate en que nunca llega a ejecutarse, porque take(2) se satisface solo con la primera lista:

Demo 2 · Asíncrono

Pruébalo tú

Ejercicio: concatena morning y evening en una sola agenda.

Relacionado: append — añade un único valor al final · prepend — añade un único valor al principio · zip — empareja los elementos en vez de encadenarlos