join

Concatena todos los elementos en una sola cadena, con un separador entre ellos.

String join<A>(String sep, Iterable<A> iterable) // data-first: separator FIRST Future<String> joinAsync<A>(String sep, FxAsyncIterable<A> iterable) String Fx.join([String separator = '']) // chain (sync, inherited from Iterable) Future<String> FxAsync.join([String sep = ',']) // chain (async)

Lección

join es un operador terminal: tira de todo el pipeline, llama a toString() en cada elemento y cose los resultados intercalando sep entre ellos.

Fíjate en el orden de los argumentos — el join de nivel superior, data-first, pone el separador primero: join(', ', iterable). Esa es la convención de FxTS (data-first en todas partes), y es justo la contraria del método Iterable.join(separator) del propio Dart, que toma el iterable como receptor y el separador como su único argumento.

Esa diferencia se filtra a la forma encadenada de un modo sutil: en la cadena síncrona, .join(...) es simplemente el Iterable.join nativo de Dart, cuyo separador por defecto es '' (vacío) si se omite. Pero FxAsync.join está escrito explícitamente en FxDart y usa como separador por defecto ',' — igual que el propio valor por defecto de FxTS. No des por hecho que ambas cadenas se comportan igual cuando omites el argumento.

Demo 1 · Fundamentos & los dos valores por defecto

Demo 2 · Asíncrono, y su valor por defecto distinto

Pruébalo tú

Ejercicio: une las columnas en una única fila de cabecera CSV, separadas por ','.

Relacionado: sort — ordena los elementos antes de unirlos · map — da formato a cada elemento antes de unirlos · size — el otro terminal sencillo de cadena/conteo