Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Flattening an Iterable<Iterable<T>> in Guava

Is there a flatten method in Guava - or an easy way to convert an Iterable<Iterable<T>> to an Iterable<T>?

I have a Multimap<K, V> [sourceMultimap] and I want to return all values where the key matches some predicate [keyPredicate]. So at the moment I have:

Iterable<Collection<V>> vals = Maps.filterKeys(sourceMultimap.asMap(), keyPredicate).values();  Collection<V> retColl = ...; for (Collection<V> vs : vals) retColl.addAll(vs); return retColl; 

I've looked through the Guava docs, but nothing jumped out. I am just checking I've not missed anything. Otherwise, I'll extract my three lines into a short flatten generic method and leave it as that.

like image 506
Andy Whitfield Avatar asked May 10 '11 11:05

Andy Whitfield


People also ask

How do I flatten a collection?

Stream flatMap() method is used to flatten a Stream of collections to a stream of objects. The objects are combined from all the collections in the original stream. The flatMap() method is a one-to-many transformation to the elements of the stream and then flattening the resulting elements into a new stream.

How do you flatten a stream list?

Create an empty list to collect the flattened elements. With the help of forEach loop, convert each elements of the list into stream and add it to the list. Now convert this list into stream using stream() method. Now flatten the stream by converting it into list using collect() method.

How do I convert iterable to collections?

To convert iterable to Collection, the iterable is first converted into spliterator. Then with the help of StreamSupport. stream(), the spliterator can be traversed and then collected with the help collect() into collection.


1 Answers

The Iterables.concat method satisfies that requirement:

public static <T> Iterable<T> concat(Iterable<? extends Iterable<? extends T>> inputs) 
like image 97
Sean Parsons Avatar answered Oct 04 '22 08:10

Sean Parsons