maxBy

El elemento cuya clave es la más grande — una sola pasada, sin ordenar, null cuando está vacío.

A? maxBy<A>(Object? Function(A a) f, Iterable<A> iterable) Future<A?> maxByAsync<A>(Object? Function(A a) f, FxAsyncIterable<A> iterable) T? Fx<T>.maxBy(Object? Function(T a) f) // chain (sync) Future<T?> FxAsync<T>.maxBy(Object? Function(T a) f) // chain (async)

Lección

maxBy responde a «¿qué elemento tiene la clave más grande?», no a «¿cuál es el número más grande?» (eso es max). Recorre el pipeline una sola vez, conservando el mejor elemento visto hasta el momento, así que es O(n) mientras que la tentadora forma sortBy(key).head() paga O(n log n) y materializa una lista ordenada que nunca llega a necesitar.

Las claves se comparan exactamente igual que las compara sortBy (Comparable.compare), y en caso de empate gana el primer elemento encontrado — así que un maxBy sobre una lista ordenada por fecha te da el más antiguo de entre los igualmente máximos.

Una entrada vacía devuelve null, igual que head y last — aquí los tipos anulables de Dart sustituyen al undefined de FxTS. Es un añadido nativo de Dart (FxTS solo trae el max numérico); el nombre sigue la forma de maxByOrNull de Kotlin.

Demo 1 · Fundamentos, caso vacío & empates

Demo 2 · Asíncrono

Pruébalo tú

Ejercicio: encuentra el gasto más grande sin ordenar.

Relacionado: minBy — la imagen especular · max — cuando quieres la clave en sí, no el elemento · sortBy — cuando de todas formas necesitas el orden completo