package org.neo4j.helpers.collection;
import java.util.Collection;
import java.util.Iterator;
/**
* Contains common functionality regarding {@link Iterator}s.
*/
public abstract class IteratorUtil
{
/**
* Returns the given iterator's only value or {@code null} if there was no
* items in the iterator. If there is more than one value in the iterator
* an {@link IllegalArgumentException} will be thrown.
*
* @param <T> the type of items in {@code iterator}.
* @param iterator the {@link Iterator} to get items from.
* @return the only value in the {@code iterator}, or {@code null} if no
* value was found. Throws {@link IllegalArgumentException} if more than
* one value was found.
*/
public static <T> T singleValueOrNull( Iterator<T> iterator )
{
T value = iterator.hasNext() ? iterator.next() : null;
if ( iterator.hasNext() )
{
throw new IllegalArgumentException( "More than one item in " +
iterator + ". First value is '" + value +
"' and the second value is '" + iterator.next() + "'" );
}
return value;
}
/**
* Adds all the items in {@code iterator} to {@code collection}.
* @param <C> the type of {@link Collection} to add to items to.
* @param <T> the type of items in the collection and iterator.
* @param iterator the {@link Iterator} to grab the items from.
* @param collection the {@link Collection} to add the items to.
* @return the {@code collection} which was passed in, now filled
* with the items from {@code iterator}.
*/
public static <C extends Collection<T>,T> C addToCollection( Iterator<T> iterator,
C collection )
{
while ( iterator.hasNext() )
{
collection.add( iterator.next() );
}
return collection;
}
/**
* Exposes {@code iterator} as an {@link Iterable}. It breaks the contract
* of {@link Iterable} in that it returns the supplied iterator instance
* for each call to {@code iterable()} on the returned {@link Iterable}
* instance. This method mostly exists to make it easy to use an
* {@link Iterator} in a for-loop.
* @param <T> the type of items in the iterator.
* @param iterator the iterator to expose as an {@link Iterable}.
* @return the supplied iterator posing as an {@link Iterable}.
*/
public static <T> Iterable<T> asIterable( final Iterator<T> iterator )
{
return new Iterable<T>()
{
public Iterator<T> iterator()
{
return iterator;
}
};
}
/**
* Counts the number of items in the {@code iterator} by looping
* through it.
* @param <T> the type of items in the iterator.
* @param iterator the {@link Iterator} to count items in.
* @return the number of found in {@code iterator}.
*/
public static <T> int count( Iterator<T> iterator )
{
int result = 0;
while ( iterator.hasNext() )
{
iterator.next();
result++;
}
return result;
}
}