Reverse elements of a Parallel Stream in Java

Given a Parallel Stream in Java, the task is to reverse its elements.
Examples:
Input: Parallel Stream = {11, 22, 33, 44}
Output: {44, 33, 22, 11}
Input: Parallel Stream = {a, b, c, d}
Output: {d, c, b, a}
Below are the various ways to do so:
- Using Collectors class : Since Streams in Java don’t store any elements, therefore, an intermediate collection is used for creating a new stream with the help of Collectors Class.
Algorithm:- Get the parallel stream.
- Convert the stream to list using Collectors.toList() method.
- For this list, reverse its elements using Collections.reverse() method.
- Convert this reversed list to stream using List.stream() method.
- Return/Print this stream with elements reversed.
Below is the implementation of the above approach:
Program:
// Java program to reverse elements// of a parallel Streamimportjava.util.*;importjava.util.stream.*;classGFG {// Generic function to reverse// the elements of the parallel streampublicstatic<T> Collector<T, ?, Stream<T> > reverseStream(){returnCollectors.collectingAndThen(Collectors.toList(),list -> {Collections.reverse(list);returnlist.stream();});}// Driver codepublicstaticvoidmain(String[] args){// Get the parallel streamList<Integer> lists = Arrays.asList(11,22,33,44);Stream<Integer> stream = lists.parallelStream();// Reverse and print the elementsstream.collect(reverseStream()).forEach(System.out::println);}}Output:44 33 22 11
- Using LinkedList class : LinkedList class implements List interface and has a feature called Stack. So LinkedList supports insertion at the front. Taking advantage of this, a LinkedList can be created from elements of the specified stream and return descending iterator to it. This would reverse the elements of the parallel stream.
Algorithm:
- Get the parallel stream.
- Convert the stream to LinkedList using Collectors.toCollection() method.
- For this LinkedList, return the descending iterator using descendingIterator() method.
- Return/Print this iterator with elements reversed.
Below is the implementation of the above approach:
Program:
// Java program to reverse elements// of a parallel Streamimportjava.util.*;importjava.util.stream.*;classGFG {// Generic function to reverse// the elements of the parallel streampublicstatic<T> Iterator<T> reverseStream(Stream<T> stream){returnstream.collect(Collectors.toCollection(LinkedList::new)).descendingIterator();}// Driver codepublicstaticvoidmain(String[] args){// Get the parallel streamList<Integer> lists = Arrays.asList(11,22,33,44);Stream<Integer> stream = lists.parallelStream();// Reverse and print the elementsIterator<Integer> reverse = reverseStream(stream);reverse.forEachRemaining(System.out::println);}}Output:44 33 22 11
- Collector.of() : The idea is to create a collector that accumulates elements of the specified Stream into an ArrayDeque or ArrayList in reverse order
Algorithm:
- Get the parallel stream.
- Convert the stream to Collection using Collectors.of() method.
- In this collection, add the elements in reverse order
- Convert this reversed collection to stream using Collection.stream() method.
- Return/Print this stream with elements reversed.
Below is the implementation of the above approach:
Program:
// Java program to reverse elements// of a parallel Streamimportjava.util.*;importjava.util.stream.*;classGFG {// Generic function to reverse// the elements of the parallel streampublicstatic<T> Stream<T> reverseStream(Stream<T> stream){returnstream.collect(Collector.of(() ->newArrayDeque<T>(), ArrayDeque::addFirst, (a, b) -> {b.addAll(a);returnb;})).stream();}// Driver codepublicstaticvoidmain(String[] args){// Get the parallel streamList<Integer> lists = Arrays.asList(11,22,33,44);Stream<Integer> stream = lists.parallelStream();// Reverse and print the elementsreverseStream(stream).forEach(System.out::println);}}Output:44 33 22 11



