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í.
2 answers
Los Iterables.el método concat satisface ese requisito:
public static <T> Iterable<T> concat(Iterable<? extends Iterable<? extends T>> inputs)
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();
}
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