Iterable and Collection have served to be of great use in Java. Iterators are used in Collection framework in Java to retrieve elements one by one and a Collection is a group of individual objects represented as a single unit. Java provides Collection Framework which defines several classes and interfaces to represent a group of objects as a single unit.
But at certain times, it is required to switch from iterable to collection and vice versa. For more details on difference between Iterable and Collection, please refer to the post Iterator vs Collection in Java.
The conversion of Iterable to Collection can be carried out in following ways:
- Creating a utility function: Creating a utility function means creating a function that converts the iterable to a collection by explicitly taking each item into account. This also can be done in many ways as explained below:
Java
import java.io.*;
import java.util.*;
class GFG {
public static <T> Collection<T>
getCollectionFromIterable(Iterable<T> itr)
{
Collection<T> cltn = new ArrayList<T>();
for (T t : itr)
cltn.add(t);
return cltn;
}
public static void main(String[] args)
{
Iterable<Integer> i = Arrays.asList( 1 , 2 , 3 , 4 );
System.out.println( "Iterable List : " + i);
Collection<Integer> cn = getCollectionFromIterable(i);
System.out.println( "Collection List : " + cn);
}
}
|
Output: Iterable List : [1, 2, 3, 4]
Collection List : [1, 2, 3, 4]
- Using Iterable.forEach():
It can be used in Java 8 and above.
Java
import java.io.*;
import java.util.*;
class GFG {
public static <T> Collection<T>
getCollectionFromIterable(Iterable<T> itr)
{
Collection<T> cltn = new ArrayList<T>();
itr.forEach(cltn::add);
return cltn;
}
public static void main(String[] args)
{
Iterable<Integer> i = Arrays.asList( 1 , 2 , 3 , 4 );
System.out.println( "Iterable List : " + i);
Collection<Integer> cn = getCollectionFromIterable(i);
System.out.println( "Collection List : " + cn);
}
}
|
Output: Iterable List : [1, 2, 3, 4]
Collection List : [1, 2, 3, 4]
- Using Iterator: The forEach loop uses Iterator in the background. Hence it can be done explicitly in the following way.
Java
import java.io.*;
import java.util.*;
class GFG {
public static <T> Collection<T>
getCollectionFromIterable(Iterable<T> itr)
{
Collection<T> cltn = new ArrayList<T>();
Iterator<T> iterator = itr.iterator();
while (iterator.hasNext()) {
cltn.add(iterator.next());
}
return cltn;
}
public static void main(String[] args)
{
Iterable<Integer> i = Arrays.asList( 1 , 2 , 3 , 4 );
System.out.println( "Iterable List : " + i);
Collection<Integer> cn = getCollectionFromIterable(i);
System.out.println( "Collection List : " + cn);
}
}
|
Output: Iterable List : [1, 2, 3, 4]
Collection List : [1, 2, 3, 4]
- Java 8 Stream: With the introduction of Stream in Java 8, works like this has become quite easy. 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.
Java
import java.io.*;
import java.util.*;
import java.util.stream.*;
class GFG {
public static <T> Collection<T>
getCollectionFromIterable(Iterable<T> itr)
{
Collection<T> cltn = new ArrayList<T>();
return StreamSupport.stream(itr.spliterator(), false )
.collect(Collectors.toList());
}
public static void main(String[] args)
{
Iterable<Integer> i = Arrays.asList( 1 , 2 , 3 , 4 );
System.out.println( "Iterable List : " + i);
Collection<Integer> cn = getCollectionFromIterable(i);
System.out.println( "Collection List : " + cn);
}
}
|
Output: Iterable List : [1, 2, 3, 4]
Collection List : [1, 2, 3, 4]