Class Iterables
Iterable. Except as noted, each method has a corresponding Iterator-based method
 in the Iterators class.
 Java 8+ users: several common uses for this class are now more comprehensively
 addressed by the new Stream library. Read the method documentation below
 for comparisons. This class is not being deprecated, but we gently encourage you to migrate to
 streams.
 
Performance notes: Unless otherwise noted, all of the iterables produced in this class are lazy, which means that their iterators only advance the backing iteration when absolutely necessary.
See the Guava User Guide article on 
 Iterables.
- Since:
- 2.0
- Author:
- Kevin Bourrillion, Jared Levy
- 
Method SummaryModifier and TypeMethodDescriptionaddAll(Collection<T> addTo, Iterable<? extends T> elementsToAdd) Adds all elements initerabletocollection.Returnstrueif every element initerablesatisfies the predicate.Returnstrueif any element initerablesatisfies the predicate.Combines multiple iterables into a single iterable.Combines multiple iterables into a single iterable.Combines two iterables into a single iterable.Combines three iterables into a single iterable.concat(Iterable<? extends T> a, Iterable<? extends T> b, Iterable<? extends T> c, Iterable<? extends T> d) Combines four iterables into a single iterable.consumingIterable(Iterable<T> iterable) Returns a view of the supplied iterable that wraps each generatedIteratorthroughIterators.consumingIterator(Iterator).static booleanReturnstrueifiterablecontains any elementofor whichObjects.equals(o, element)would returntrue.Returns an iterable whose iterators cycle indefinitely over the elements ofiterable.cycle(T... elements) Returns an iterable whose iterators cycle indefinitely over the provided elements.static booleanelementsEqual(Iterable<?> iterable1, Iterable<?> iterable2) Determines whether two iterables contain equal elements in the same order.static <T> Iterable<T> Returns a view ofunfilteredcontaining all elements that are of the typedesiredType.Returns a view ofunfilteredcontaining all elements that satisfy the input predicateretainIfTrue.Returns the first element initerablethat satisfies the given predicate, ordefaultValueif none found.Returns the first element initerablethat satisfies the given predicate; use this method only when such an element is known to exist.static intReturns the number of elements in the specified iterable that equal the specified object.Returns the element at the specified position in an iterable or a default value otherwise.Returns the element at the specified position in an iterable.Returns the first element initerableordefaultValueif the iterable is empty.Returns the last element ofiterableordefaultValueif the iterable is empty.Returns the last element ofiterable.getOnlyElement(Iterable<? extends T> iterable, T defaultValue) Returns the single element contained initerable, ordefaultValueif the iterable is empty.getOnlyElement(Iterable<T> iterable) Returns the single element contained initerable.Returns the index initerableof the first element that satisfies the providedpredicate, or-1if the Iterable has no such elements.static booleanDetermines if the given iterable contains no elements.Returns a view ofiterablecontaining its firstlimitSizeelements.mergeSorted(Iterable<? extends Iterable<? extends T>> iterables, Comparator<? super T> comparator) Returns an iterable over the merged contents of all giveniterables.paddedPartition(Iterable<T> iterable, int size) Divides an iterable into unmodifiable sublists of the given size, padding the final iterable with null values if necessary.Divides an iterable into unmodifiable sublists of the given size (the final iterable may be smaller).static booleanremoveAll(Iterable<?> removeFrom, Collection<?> elementsToRemove) Removes, from an iterable, every element that belongs to the provided collection.Removes, from an iterable, every element that satisfies the provided predicate.static booleanretainAll(Iterable<?> removeFrom, Collection<?> elementsToRetain) Removes, from an iterable, every element that does not belong to the provided collection.static intReturns the number of elements initerable.Returns a view ofiterablethat skips its firstnumberToSkipelements.Copies an iterable's elements into an array.static StringReturns a string representation ofiterable, with the format[e1, e2, ..., en](that is, identical toArrays.toString(Iterables.toArray(iterable))).Returns a view containing the result of applyingfunctionto each element offromIterable.static <T> Optional<T> Returns anOptionalcontaining the first element initerablethat satisfies the given predicate, if such an element exists.static <E> Iterable<E> unmodifiableIterable(ImmutableCollection<E> iterable) Deprecated.no need to use thisunmodifiableIterable(Iterable<? extends T> iterable) Returns an unmodifiable view ofiterable.
- 
Method Details- 
unmodifiableIterable
- 
unmodifiableIterable@InlineMe(replacement="checkNotNull(iterable)", staticImports="com.google.common.base.Preconditions.checkNotNull") @Deprecated public static <E> Iterable<E> unmodifiableIterable(ImmutableCollection<E> iterable) Deprecated.no need to use thisSimply returns its argument.- Since:
- 10.0
 
- 
sizeReturns the number of elements initerable.
- 
containsReturnstrueifiterablecontains any elementofor whichObjects.equals(o, element)would returntrue. Otherwise returnsfalse, even in cases whereCollection.contains(java.lang.Object)might throwNullPointerExceptionorClassCastException.
- 
removeAll@CanIgnoreReturnValue public static boolean removeAll(Iterable<?> removeFrom, Collection<?> elementsToRemove) Removes, from an iterable, every element that belongs to the provided collection.This method calls Collection.removeAll(java.util.Collection<?>)ifiterableis a collection, andIterators.removeAll(java.util.Iterator<?>, java.util.Collection<?>)otherwise.- Parameters:
- removeFrom- the iterable to (potentially) remove elements from
- elementsToRemove- the elements to remove
- Returns:
- trueif any element was removed from- iterable
 
- 
retainAll@CanIgnoreReturnValue public static boolean retainAll(Iterable<?> removeFrom, Collection<?> elementsToRetain) Removes, from an iterable, every element that does not belong to the provided collection.This method calls Collection.retainAll(java.util.Collection<?>)ifiterableis a collection, andIterators.retainAll(java.util.Iterator<?>, java.util.Collection<?>)otherwise.- Parameters:
- removeFrom- the iterable to (potentially) remove elements from
- elementsToRetain- the elements to retain
- Returns:
- trueif any element was removed from- iterable
 
- 
removeIf@CanIgnoreReturnValue public static <T extends @Nullable Object> boolean removeIf(Iterable<T> removeFrom, Predicate<? super T> predicate) Removes, from an iterable, every element that satisfies the provided predicate.Removals may or may not happen immediately as each element is tested against the predicate. The behavior of this method is not specified if predicateis dependent onremoveFrom.Java 8+ users: if removeFromis aCollection, useremoveFrom.removeIf(predicate)instead.- Parameters:
- removeFrom- the iterable to (potentially) remove elements from
- predicate- a predicate that determines whether an element should be removed
- Returns:
- trueif any elements were removed from the iterable
- Throws:
- UnsupportedOperationException- if the iterable does not support- remove().
- Since:
- 2.0
 
- 
elementsEqualDetermines whether two iterables contain equal elements in the same order. More specifically, this method returnstrueifiterable1anditerable2contain the same number of elements and every element ofiterable1is equal to the corresponding element ofiterable2.
- 
toStringReturns a string representation ofiterable, with the format[e1, e2, ..., en](that is, identical toArrays.toString(Iterables.toArray(iterable))). Note that for most implementations ofCollection,collection.toString()also gives the same result, but that behavior is not generally guaranteed.
- 
getOnlyElementReturns the single element contained initerable.Java 8+ users: the Streamequivalent to this method isstream.collect(MoreCollectors.onlyElement()).- Throws:
- NoSuchElementException- if the iterable is empty
- IllegalArgumentException- if the iterable contains multiple elements
 
- 
getOnlyElementpublic static <T extends @Nullable Object> T getOnlyElement(Iterable<? extends T> iterable, T defaultValue) Returns the single element contained initerable, ordefaultValueif the iterable is empty.Java 8+ users: the Streamequivalent to this method isstream.collect(MoreCollectors.toOptional()).orElse(defaultValue).- Throws:
- IllegalArgumentException- if the iterator contains multiple elements
 
- 
toArray@GwtIncompatible public static <T extends @Nullable Object> T[] toArray(Iterable<? extends T> iterable, Class<@NonNull T> type) Copies an iterable's elements into an array.- Parameters:
- iterable- the iterable to copy
- type- the type of the elements
- Returns:
- a newly-allocated array into which all the elements of the iterable have been copied
 
- 
addAll@CanIgnoreReturnValue public static <T extends @Nullable Object> boolean addAll(Collection<T> addTo, Iterable<? extends T> elementsToAdd) Adds all elements initerabletocollection.- Returns:
- trueif- collectionwas modified as a result of this operation.
 
- 
frequencyReturns the number of elements in the specified iterable that equal the specified object. This implementation avoids a full iteration when the iterable is aMultisetorSet.Java 8+ users: In most cases, the Streamequivalent of this method isstream.filter(element::equals).count(). Ifelementmight be null, usestream.filter(Predicate.isEqual(element)).count()instead.- See Also:
 
- 
cycleReturns an iterable whose iterators cycle indefinitely over the elements ofiterable.That iterator supports remove()ifiterable.iterator()does. Afterremove()is called, subsequent cycles omit the removed element, which is no longer initerable. The iterator'shasNext()method returnstrueuntiliterableis empty.Warning: Typical uses of the resulting iterator may produce an infinite loop. You should use an explicit breakor be certain that you will eventually remove all the elements.To cycle over the iterable ntimes, use the following:Iterables.concat(Collections.nCopies(n, iterable))Java 8+ users: The Streamequivalent of this method isStream.generate(() -> iterable).flatMap(Streams::stream).
- 
cycleReturns an iterable whose iterators cycle indefinitely over the provided elements.After removeis invoked on a generated iterator, the removed element will no longer appear in either that iterator or any other iterator created from the same source iterable. That is, this method behaves exactly asIterables.cycle(Lists.newArrayList(elements)). The iterator'shasNextmethod returnstrueuntil all of the original elements have been removed.Warning: Typical uses of the resulting iterator may produce an infinite loop. You should use an explicit breakor be certain that you will eventually remove all the elements.To cycle over the elements ntimes, use the following:Iterables.concat(Collections.nCopies(n, Arrays.asList(elements)))Java 8+ users: If passing a single element e, theStreamequivalent of this method isStream.generate(() -> e). Otherwise, put the elements in a collection and useStream.generate(() -> collection).flatMap(Collection::stream).
- 
concatpublic static <T extends @Nullable Object> Iterable<T> concat(Iterable<? extends T> a, Iterable<? extends T> b) Combines two iterables into a single iterable. The returned iterable has an iterator that traverses the elements ina, followed by the elements inb. The source iterators are not polled until necessary.The returned iterable's iterator supports remove()when the corresponding input iterator supports it.Java 8+ users: The Streamequivalent of this method isStream.concat(a, b).
- 
concatpublic static <T extends @Nullable Object> Iterable<T> concat(Iterable<? extends T> a, Iterable<? extends T> b, Iterable<? extends T> c) Combines three iterables into a single iterable. The returned iterable has an iterator that traverses the elements ina, followed by the elements inb, followed by the elements inc. The source iterators are not polled until necessary.The returned iterable's iterator supports remove()when the corresponding input iterator supports it.Java 8+ users: The Streamequivalent of this method isStreams.concat(a, b, c).
- 
concatpublic static <T extends @Nullable Object> Iterable<T> concat(Iterable<? extends T> a, Iterable<? extends T> b, Iterable<? extends T> c, Iterable<? extends T> d) Combines four iterables into a single iterable. The returned iterable has an iterator that traverses the elements ina, followed by the elements inb, followed by the elements inc, followed by the elements ind. The source iterators are not polled until necessary.The returned iterable's iterator supports remove()when the corresponding input iterator supports it.Java 8+ users: The Streamequivalent of this method isStreams.concat(a, b, c, d).
- 
concat@SafeVarargs public static <T extends @Nullable Object> Iterable<T> concat(Iterable<? extends T>... inputs) Combines multiple iterables into a single iterable. The returned iterable has an iterator that traverses the elements of each iterable ininputs. The input iterators are not polled until necessary.The returned iterable's iterator supports remove()when the corresponding input iterator supports it.Java 8+ users: The Streamequivalent of this method isStreams.concat(...).- Throws:
- NullPointerException- if any of the provided iterables is null
 
- 
concatpublic static <T extends @Nullable Object> Iterable<T> concat(Iterable<? extends Iterable<? extends T>> inputs) Combines multiple iterables into a single iterable. The returned iterable has an iterator that traverses the elements of each iterable ininputs. The input iterators are not polled until necessary.The returned iterable's iterator supports remove()when the corresponding input iterator supports it. The methods of the returned iterable may throwNullPointerExceptionif any of the input iterators is null.Java 8+ users: The Streamequivalent of this method isstreamOfStreams.flatMap(s -> s).
- 
partitionpublic static <T extends @Nullable Object> Iterable<List<T>> partition(Iterable<T> iterable, int size) Divides an iterable into unmodifiable sublists of the given size (the final iterable may be smaller). For example, partitioning an iterable containing[a, b, c, d, e]with a partition size of 3 yields[[a, b, c], [d, e]]-- an outer iterable containing two inner lists of three and two elements, all in the original order.Iterators returned by the returned iterable do not support the Iterator.remove()method. The returned lists implementRandomAccess, whether or not the input list does.Note: The current implementation eagerly allocates storage for sizeelements. As a consequence, passing values likeInteger.MAX_VALUEcan lead toOutOfMemoryError.Note: if iterableis aList, useLists.partition(List, int)instead.- Parameters:
- iterable- the iterable to return a partitioned view of
- size- the desired size of each partition (the last may be smaller)
- Returns:
- an iterable of unmodifiable lists containing the elements of iterabledivided into partitions
- Throws:
- IllegalArgumentException- if- sizeis nonpositive
 
- 
paddedPartitionpublic static <T extends @Nullable Object> Iterable<List<@Nullable T>> paddedPartition(Iterable<T> iterable, int size) Divides an iterable into unmodifiable sublists of the given size, padding the final iterable with null values if necessary. For example, partitioning an iterable containing[a, b, c, d, e]with a partition size of 3 yields[[a, b, c], [d, e, null]]-- an outer iterable containing two inner lists of three elements each, all in the original order.Iterators returned by the returned iterable do not support the Iterator.remove()method.- Parameters:
- iterable- the iterable to return a partitioned view of
- size- the desired size of each partition
- Returns:
- an iterable of unmodifiable lists containing the elements of iterabledivided into partitions (the final iterable may have trailing null elements)
- Throws:
- IllegalArgumentException- if- sizeis nonpositive
 
- 
filterpublic static <T extends @Nullable Object> Iterable<T> filter(Iterable<T> unfiltered, Predicate<? super T> retainIfTrue) Returns a view ofunfilteredcontaining all elements that satisfy the input predicateretainIfTrue. The returned iterable's iterator does not supportremove().Streamequivalent:Stream.filter(java.util.function.Predicate<? super T>).
- 
filterReturns a view ofunfilteredcontaining all elements that are of the typedesiredType. The returned iterable's iterator does not supportremove().Streamequivalent:stream.filter(type::isInstance).map(type::cast). This does perform a little more work than necessary, so another option is to insert an unchecked cast at some later point:@SuppressWarnings("unchecked") // safe because of ::isInstance check ImmutableList<NewType> result = (ImmutableList) stream.filter(NewType.class::isInstance).collect(toImmutableList());
- 
anypublic static <T extends @Nullable Object> boolean any(Iterable<T> iterable, Predicate<? super T> predicate) Returnstrueif any element initerablesatisfies the predicate.Streamequivalent:Stream.anyMatch(java.util.function.Predicate<? super T>).
- 
allpublic static <T extends @Nullable Object> boolean all(Iterable<T> iterable, Predicate<? super T> predicate) Returnstrueif every element initerablesatisfies the predicate. Ifiterableis empty,trueis returned.Streamequivalent:Stream.allMatch(java.util.function.Predicate<? super T>).
- 
findpublic static <T extends @Nullable Object> T find(Iterable<T> iterable, Predicate<? super T> predicate) Returns the first element initerablethat satisfies the given predicate; use this method only when such an element is known to exist. If it is possible that no element will match, usetryFind(java.lang.Iterable<T>, com.google.common.base.Predicate<? super T>)orfind(Iterable, Predicate, Object)instead.Streamequivalent:stream.filter(predicate).findFirst().get()- Throws:
- NoSuchElementException- if no element in- iterablematches the given predicate
 
- 
findpublic static <T extends @Nullable Object> @Nullable T find(Iterable<? extends T> iterable, Predicate<? super T> predicate, @Nullable T defaultValue) Returns the first element initerablethat satisfies the given predicate, ordefaultValueif none found. Note that this can usually be handled more naturally usingtryFind(iterable, predicate).or(defaultValue).Streamequivalent:stream.filter(predicate).findFirst().orElse(defaultValue)- Since:
- 7.0
 
- 
tryFindReturns anOptionalcontaining the first element initerablethat satisfies the given predicate, if such an element exists.Warning: avoid using a predicatethat matchesnull. Ifnullis matched initerable, a NullPointerException will be thrown.Streamequivalent:stream.filter(predicate).findFirst()- Since:
- 11.0
 
- 
indexOfpublic static <T extends @Nullable Object> int indexOf(Iterable<T> iterable, Predicate<? super T> predicate) Returns the index initerableof the first element that satisfies the providedpredicate, or-1if the Iterable has no such elements.More formally, returns the lowest index isuch thatpredicate.apply(Iterables.get(iterable, i))returnstrue, or-1if there is no such index.- Since:
- 2.0
 
- 
transformpublic static <F extends @Nullable Object, T extends @Nullable Object> Iterable<T> transform(Iterable<F> fromIterable, Function<? super F, ? extends T> function) Returns a view containing the result of applyingfunctionto each element offromIterable.The returned iterable's iterator supports remove()iffromIterable's iterator does. After a successfulremove()call,fromIterableno longer contains the corresponding element.If the input Iterableis known to be aListor otherCollection, considerLists.transform(java.util.List<F>, com.google.common.base.Function<? super F, ? extends T>)andCollections2.transform(java.util.Collection<F>, com.google.common.base.Function<? super F, T>).Streamequivalent:Stream.map(java.util.function.Function<? super T, ? extends R>)
- 
getReturns the element at the specified position in an iterable.Streamequivalent:stream.skip(position).findFirst().get()(throwsNoSuchElementExceptionif out of bounds)- Parameters:
- position- position of the element to return
- Returns:
- the element at the specified position in iterable
- Throws:
- IndexOutOfBoundsException- if- positionis negative or greater than or equal to the size of- iterable
 
- 
getpublic static <T extends @Nullable Object> T get(Iterable<? extends T> iterable, int position, T defaultValue) Returns the element at the specified position in an iterable or a default value otherwise.Streamequivalent:stream.skip(position).findFirst().orElse(defaultValue)(returns the default value if the index is out of bounds)- Parameters:
- position- position of the element to return
- defaultValue- the default value to return if- positionis greater than or equal to the size of the iterable
- Returns:
- the element at the specified position in iterableordefaultValueifiterablecontains fewer thanposition + 1elements.
- Throws:
- IndexOutOfBoundsException- if- positionis negative
- Since:
- 4.0
 
- 
getFirstpublic static <T extends @Nullable Object> T getFirst(Iterable<? extends T> iterable, T defaultValue) Returns the first element initerableordefaultValueif the iterable is empty. TheIteratorsanalog to this method isIterators.getNext(java.util.Iterator<? extends T>, T).If no default value is desired (and the caller instead wants a NoSuchElementExceptionto be thrown), it is recommended thatiterable.iterator().next()is used instead.To get the only element in a single-element Iterable, consider usinggetOnlyElement(Iterable)orgetOnlyElement(Iterable, Object)instead.Streamequivalent:stream.findFirst().orElse(defaultValue)Java 21+ users: if {code iterable} is a SequencedCollection(e.g., any list), consider usingcollection.getFirst()instead. Note that if the collection is empty,getFirst()throws aNoSuchElementException, while this method returns the default value.- Parameters:
- defaultValue- the default value to return if the iterable is empty
- Returns:
- the first element of iterableor the default value
- Since:
- 7.0
 
- 
getLastReturns the last element ofiterable. Ifiterableis aListwithRandomAccesssupport, then this operation is guaranteed to beO(1).Streamequivalent:Streams.findLast(stream).get()Java 21+ users: if {code iterable} is a SequencedCollection(e.g., any list), consider usingcollection.getLast()instead.- Returns:
- the last element of iterable
- Throws:
- NoSuchElementException- if the iterable is empty
 
- 
getLastpublic static <T extends @Nullable Object> T getLast(Iterable<? extends T> iterable, T defaultValue) Returns the last element ofiterableordefaultValueif the iterable is empty. Ifiterableis aListwithRandomAccesssupport, then this operation is guaranteed to beO(1).Streamequivalent:Streams.findLast(stream).orElse(defaultValue)Java 21+ users: if {code iterable} is a SequencedCollection(e.g., any list), consider usingcollection.getLast()instead. Note that if the collection is empty,getLast()throws aNoSuchElementException, while this method returns the default value.- Parameters:
- defaultValue- the value to return if- iterableis empty
- Returns:
- the last element of iterableor the default value
- Since:
- 3.0
 
- 
skipReturns a view ofiterablethat skips its firstnumberToSkipelements. Ifiterablecontains fewer thannumberToSkipelements, the returned iterable skips all of its elements.Modifications to the underlying Iterablebefore a call toiterator()are reflected in the returned iterator. That is, the iterator skips the firstnumberToSkipelements that exist when theIteratoris created, not whenskip()is called.The returned iterable's iterator supports remove()if the iterator of the underlying iterable supports it. Note that it is not possible to delete the last skipped element by immediately callingremove()on that iterator, as theIteratorcontract states that a call toremove()before a call tonext()will throw anIllegalStateException.Streamequivalent:Stream.skip(long)- Since:
- 3.0
 
- 
limitReturns a view ofiterablecontaining its firstlimitSizeelements. Ifiterablecontains fewer thanlimitSizeelements, the returned view contains all of its elements. The returned iterable's iterator supportsremove()ifiterable's iterator does.Streamequivalent:Stream.limit(long)- Parameters:
- iterable- the iterable to limit
- limitSize- the maximum number of elements in the returned iterable
- Throws:
- IllegalArgumentException- if- limitSizeis negative
- Since:
- 3.0
 
- 
consumingIterableReturns a view of the supplied iterable that wraps each generatedIteratorthroughIterators.consumingIterator(Iterator).Note: If iterableis aQueue, the returned iterable will instead useCollection.isEmpty()andQueue.remove(), sinceQueue's iteration order is undefined. CallingIterator.hasNext()on a generated iterator from the returned iterable may cause an item to be immediately dequeued for return on a subsequent call toIterator.next().Whether the input iterableis aQueueor not, the returnedIterableis not thread-safe.- Parameters:
- iterable- the iterable to wrap
- Returns:
- a view of the supplied iterable that wraps each generated iterator through Iterators.consumingIterator(Iterator); for queues, an iterable that generates iterators that return and consume the queue's elements in queue order
- Since:
- 2.0
- See Also:
 
- 
isEmptyDetermines if the given iterable contains no elements.There is no precise Iteratorequivalent to this method, since one can only ask an iterator whether it has any elements remaining (which one does usingIterator.hasNext()).Streamequivalent:!stream.findAny().isPresent()- Returns:
- trueif the iterable contains no elements
 
- 
mergeSortedpublic static <T extends @Nullable Object> Iterable<T> mergeSorted(Iterable<? extends Iterable<? extends T>> iterables, Comparator<? super T> comparator) Returns an iterable over the merged contents of all giveniterables. Equivalent entries will not be de-duplicated.Callers must ensure that the source iterablesare in non-descending order as this method does not sort its input.For any equivalent elements across all iterables, elements are returned in the order of their source iterables. That is, if element A from iterable 1 and element B from iterable 2 compare as equal, A will be returned before B if iterable 1 was passed before iterable 2.- Since:
- 11.0
 
 
-