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 anIntStream
from anint
spliterator.StreamSupport.longStream(Spliterator.OfLong spliterator, boolean parallel)
: Creates aLongStream
from along
spliterator.StreamSupport.doubleStream(Spliterator.OfDouble spliterator, boolean parallel)
: Creates aDoubleStream
from adouble
spliterator.
3. Common Methods
- stream: Creates a regular stream from a spliterator.
- intStream: Creates an
IntStream
from anint
spliterator. - longStream: Creates a
LongStream
from along
spliterator. - doubleStream: Creates a
DoubleStream
from adouble
spliterator.
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.