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 StreamÂÂimportjava.util.*;importjava.util.stream.*;ÂÂclassGFG {   Â// Generic function to reverse   Â// the elements of the parallel stream   Âpublicstatic<T> Collector<T, ?, Stream<T> > reverseStream()   Â{       ÂreturnCollectors           Â.collectingAndThen(Collectors.toList(),                              Âlist -> {                                  ÂCollections.reverse(list);                                  Âreturnlist.stream();                              Â});   Â}   Â// Driver code   Âpublicstaticvoidmain(String[] args)   Â{       Â// Get the parallel stream       ÂList<Integer> lists = Arrays.asList(11,22,33,44);       ÂStream<Integer> stream = lists.parallelStream();       Â// Reverse and print the elements       Âstream.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 StreamÂÂimportjava.util.*;importjava.util.stream.*;ÂÂclassGFG {   Â// Generic function to reverse   Â// the elements of the parallel stream   Âpublicstatic<T> Iterator<T> reverseStream(Stream<T> stream)   Â{       Âreturnstream           Â.collect(Collectors                        Â.toCollection(LinkedList::new))           Â.descendingIterator();   Â}   Â// Driver code   Âpublicstaticvoidmain(String[] args)   Â{       Â// Get the parallel stream       ÂList<Integer> lists = Arrays.asList(11,22,33,44);       ÂStream<Integer> stream = lists.parallelStream();       Â// Reverse and print the elements       ÂIterator<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 StreamÂÂimportjava.util.*;importjava.util.stream.*;ÂÂclassGFG {   Â// Generic function to reverse   Â// the elements of the parallel stream   Âpublicstatic<T> Stream<T> reverseStream(Stream<T> stream)   Â{       Âreturnstream           Â.collect(               ÂCollector.of(                   Â() ->newArrayDeque<T>(), ArrayDeque::addFirst, (a, b) -> {                       Âb.addAll(a);                       Âreturnb;                   Â}))           Â.stream();   Â}   Â// Driver code   Âpublicstaticvoidmain(String[] args)   Â{       Â// Get the parallel stream       ÂList<Integer> lists = Arrays.asList(11,22,33,44);       ÂStream<Integer> stream = lists.parallelStream();       Â// Reverse and print the elements       ÂreverseStream(stream)           Â.forEach(System.out::println);   Â}}Output:44 33 22 11 


 
                                    







