partition

Divide un pipeline en dos listas de una sola vez, con un único predicado.

(List<A>, List<A>) partition<A>(bool Function(A a) f, Iterable<A> iterable) Future<(List<A>, List<A>)> partitionAsync<A>(FutureOr<bool> Function(A a) f, FxAsyncIterable<A> iterable) (List<T>, List<T>) Fx.partition(bool Function(T a) f) Future<(List<T>, List<T>)> FxAsync.partition(FutureOr<bool> Function(T a) f)

Lección

partition es un operador terminal que recorre el pipeline una sola vez y reparte cada elemento en una de dos listas según un predicado: los elementos para los que el predicado devuelve true van a la primera lista, y todo lo demás a la segunda. Equivale a llamar por separado a filter y reject, pero en una sola pasada sobre los datos.

FxTS devuelve una tupla de dos elementos, [pass, fail]. Dart no tiene un tipo tupla integrado al estilo de los arrays de JS, así que FxDart usa un record nativo de Dart: (List<A>, List<A>). Accede a las dos listas con .$1 (los que pasan) y .$2 (los que no), o desestructúralas directamente con la sintaxis de patrones: final (pass, fail) = partition(f, iterable);. Es la misma convención de tupla a record que usan zip y entries en el resto de FxDart.

Como todos los terminales de esta sección, tira de todo el pipeline perezoso que tenga aguas arriba, sea síncrono o asíncrono.

Demo 1 · Fundamentos y desestructuración

Demo 2 · Asíncrono

Pruébalo tú

Ejercicio: reparte las notas en aprobadas (>= 60) y suspensas (< 60).

Relacionado: filter · reject — las dos mitades que partition combina · groupBy — agrupar en más de dos cubetas · sort — ordenar dentro de cada lado, si lo necesitas