Reputation: 145
I want to get the next element from a spliterator, not just "perform action" on the next element. For example by implementing the following method
<T> T getnext(Spliterator<T> s) {
}
All search results I found just said that tryAdvance() was like a combination of an iterators hasNext() and next(), except that is a BIG LIE because I can't get next element, just "perform action on next element".
Upvotes: 5
Views: 773
Reputation: 59988
There are no direct way but you can use :
<T> T getnext(Spliterator<T> s) {
Stream<T> stream = StreamSupport.stream(s, false); // convert Spliterator to stream
Iterable<T> iterable = stream::iterator; // then stream to Iterable
return iterable.iterator().next(); // then you can get next element
}
Or in one step like so :
return StreamSupport.stream(s, false).iterator().next();
Or more simpler :
return Spliterators.iterator(s).next();
Upvotes: 1
Reputation: 3134
transform spliterator to stream
<T> Optional<T> getnext(Spliterator<T> s) {
return StreamSupport.stream(s, false).findFirst();
}
example
List<String> lst = List.of("a", "b");
Spliterator<String> spliterator = lst.spliterator();
System.out.println(getnext(spliterator)); //Optional[a]
System.out.println(getnext(spliterator)); //Optional[b]
Upvotes: 1
Reputation: 2386
You can wrap the item in a list and then return from that list:
public static <T> T getNext(Spliterator<T> spliterator) {
List<T> result = new ArrayList<>(1);
if (spliterator.tryAdvance(result::add)) {
return result.get(0);
} else {
return null;
}
}
To make it more obvious to the caller that this is an operation that may return null, consider returning Optional
:
public static <T> Optional<T> getNext(Spliterator<T> spliterator) {
final List<T> result = new ArrayList<>(1);
if (spliterator.tryAdvance(result::add)) {
return Optional.of(result.get(0));
} else {
return Optional.empty();
}
}
Upvotes: 4