public static <T> Collection<ArrayList<T>> split(
			final Collection<? extends T> elements, final int batchSize) {
		return new AbstractCollection<ArrayList<T>>() {

			@Override
			public Iterator<ArrayList<T>> iterator() {
				return split((Iterable<? extends T>) elements, batchSize)
						.iterator();
			}

			@Override
			public int size() {
				// rounding up
				return (elements.size() + batchSize - 1) / batchSize;
			}
		};
	}
public static <T> Collection<ArrayList<T>> split(
			final Collection<? extends T> elements, final int batchSize) {
		return new AbstractCollection<ArrayList<T>>() {

			@Override
			public Iterator<ArrayList<T>> iterator() {
				return split((Iterable<? extends T>) elements, batchSize)
						.iterator();
			}

			@Override
			public int size() {
				
				return (elements.size() + batchSize - 1) / batchSize;
			}
		};
	}
public static < T > Collection < ArrayList < T > > split ( final Collection < ? extends T > elements , final int batchSize ) { return new AbstractCollection < ArrayList < T > > ( ) { @ Override public Iterator < ArrayList < T > > iterator ( ) { return split ( ( Iterable < ? extends T > ) elements , batchSize ) . iterator ( ) ; } @ Override public int size ( ) { // rounding up return ( elements . size ( ) + batchSize - 1 ) / batchSize ; } } ; }
Splits the input {@link Collection} on batches with at most given number
of elements.

@param elements
the {@link Collection} to be split
@param batchSize
the maximal number of elements in batches
@return a {@link Collection} of batches containing elements from the
input collection
Splits the input { @link Collection } on batches with at most given number of elements .