Introduction
StreamSupport is a utility class in Java’s java.util.stream package that provides methods for creating streams from spliterators. It allows for more customized stream creation, especially useful when working with custom data structures.
Table of Contents
- What is
StreamSupport? - Creating a Stream with
StreamSupport - Common Methods
- Examples of
StreamSupport - Real-World Use Case
- Conclusion
1. What is StreamSupport?
StreamSupport is a utility class that provides static methods for creating sequential or parallel streams from spliterators, offering flexibility in stream generation.
2. Creating a Stream with StreamSupport
You can create streams using StreamSupport with the following methods:
StreamSupport.stream(Spliterator<T> spliterator, boolean parallel): Creates a stream from a spliterator.StreamSupport.intStream(Spliterator.OfInt spliterator, boolean parallel): Creates anIntStreamfrom anintspliterator.StreamSupport.longStream(Spliterator.OfLong spliterator, boolean parallel): Creates aLongStreamfrom alongspliterator.StreamSupport.doubleStream(Spliterator.OfDouble spliterator, boolean parallel): Creates aDoubleStreamfrom adoublespliterator.
3. Common Methods
- stream: Creates a regular stream from a spliterator.
- intStream: Creates an
IntStreamfrom anintspliterator. - longStream: Creates a
LongStreamfrom alongspliterator. - doubleStream: Creates a
DoubleStreamfrom adoublespliterator.
4. Examples of StreamSupport
Example 1: Creating a Stream from a Custom Spliterator
This example demonstrates how to create a stream from a custom spliterator using StreamSupport.
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.stream.StreamSupport;
public class CustomSpliteratorExample {
public static void main(String[] args) {
Spliterator<String> spliterator = Spliterators.spliterator(new String[]{"Arjun", "Bhavna", "Chirag"}, 0);
StreamSupport.stream(spliterator, false)
.forEach(System.out::println);
}
}
Output:
Arjun
Bhavna
Chirag
Example 2: Creating an IntStream from a Spliterator
This example shows how to create an IntStream from an int array using StreamSupport.
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.stream.StreamSupport;
public class IntStreamExample {
public static void main(String[] args) {
Spliterator.OfInt spliterator = Spliterators.spliterator(new int[]{1, 2, 3, 4, 5}, 0);
StreamSupport.intStream(spliterator, false)
.forEach(System.out::println);
}
}
Output:
1
2
3
4
5
5. Real-World Use Case: Creating a Stream from a Custom Data Structure
This example illustrates how to create a stream from a custom data structure using a custom spliterator.
import java.util.Spliterator;
import java.util.function.Consumer;
import java.util.stream.StreamSupport;
class Node {
String name;
Node next;
Node(String name, Node next) {
this.name = name;
this.next = next;
}
}
class NodeSpliterator implements Spliterator<String> {
private Node current;
NodeSpliterator(Node start) {
this.current = start;
}
@Override
public boolean tryAdvance(Consumer<? super String> action) {
if (current != null) {
action.accept(current.name);
current = current.next;
return true;
}
return false;
}
@Override
public Spliterator<String> trySplit() {
return null; // No splitting for simplicity
}
@Override
public long estimateSize() {
return Long.MAX_VALUE; // Unknown size
}
@Override
public int characteristics() {
return ORDERED | NONNULL;
}
}
public class CustomDataStructureExample {
public static void main(String[] args) {
Node node3 = new Node("Chirag", null);
Node node2 = new Node("Bhavna", node3);
Node node1 = new Node("Arjun", node2);
NodeSpliterator nodeSpliterator = new NodeSpliterator(node1);
StreamSupport.stream(nodeSpliterator, false)
.forEach(System.out::println);
}
}
Output:
Arjun
Bhavna
Chirag
Conclusion
StreamSupport provides flexibility for creating streams from custom data structures and spliterators. It enhances the power of the Stream API by allowing more control over the stream creation process, especially when working with non-standard data sources. Using StreamSupport can lead to more versatile and efficient stream processing in Java.