Aplanar un iterable> en Guayaba


¿Hay un método flatten en guayaba - o una manera fácil de convertir un Iterable<Iterable<T>> a un Iterable<T>?

Tengo un Multimap<K, V> [sourceMultimap] y quiero devolver todos los valores donde la clave coincide con algún predicado [keyPredicate]. Así que en este momento tengo:

Iterable<Collection<V>> vals = Maps.filterKeys(sourceMultimap.asMap(), keyPredicate).values();

Collection<V> retColl = ...;
for (Collection<V> vs : vals) retColl.addAll(vs);
return retColl;

He mirado a través de los documentos de Guayaba, pero nada saltó. Sólo estoy comprobando que no me he perdido nada. De lo contrario, extraeré mis tres líneas en un método genérico de aplanar corto y lo dejaré así.

Author: joragupra, 2011-05-10

2 answers

Los Iterables.el método concat satisface ese requisito:

public static <T> Iterable<T> concat(Iterable<? extends Iterable<? extends T>> inputs)
 72
Author: Sean Parsons,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-02 10:14:36

A partir de Java 8, puedes hacer esto sin Guayaba. Es un poco torpe porque Iterable no proporciona directamente flujos, lo que requiere el uso de StreamSupport, pero no requiere crear una nueva colección como el código en la pregunta.

private static <T> Iterable<T> concat(Iterable<? extends Iterable<T>> foo) {
    return () -> StreamSupport.stream(foo.spliterator(), false)
        .flatMap(i -> StreamSupport.stream(i.spliterator(), false))
        .iterator();
}
 3
Author: Jeffrey Bosboom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-09 04:48:45