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.
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.
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.
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.
The Iterables.concat method satisfies that requirement:
public static <T> Iterable<T> concat(Iterable<? extends Iterable<? extends T>> inputs)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With