Reputation: 961
What would be a good use-case scenario for the Spliterator
class in Java 8?
Upvotes: 21
Views: 1513
Reputation: 269647
Normally, an application developer would not consume the Spliterator
API directly. But if you are providing an API, and implement your own collection-like class, you can implement Spliterator
to adapt your collection to the Stream
API. This supports a functional approach, parallel processing, and other features.
For example, I wrote a utility to enumerate IP addresses in a network, specified by CIDR notation. It's not really a collection; that is, it doesn't carry list of all of the addresses in memory at once, only the network number and netmask. But by exposing a Spliterator
, it can be easily adapted to a Stream
. (Each Spliterator
just tracks the current IP address and maximum address in its share of the network.)
Other examples from the core Java runtime are listing files or traversing the file system.
Upvotes: 6
Reputation: 3530
Use case example: "Converts iterator to stream"
public static <T> Stream<T> iteratorToFiniteStream(final Iterator<T> iterator) {
final Iterable<T> iterable = () -> iterator;
return StreamSupport.stream(iterable.spliterator(), false);
}
Upvotes: 6
Reputation: 3940
Spliterator
is an extension of the timeless Iterator
class that allows for splitting of a stream of objects to iterate over (Stream
works by collecting the operations before iterating).
I cannot think of any times when the average developer would have to work with Spliterator
. The Collection
and Collections
APIs are incredibly rich in Java 8, and in most cases you'd be better off using a vanilla Collection
subclass instead of building your own Stream
interface.
An example of when you might want to use Spliterator
might be a library for graphs using a linked data structure over which the standard Spliterator
/stream()
is undefined.
Upvotes: 3