Github user ajs6f commented on the issue:
https://github.com/apache/jena/pull/323
I'm saying we don't do `orElseThrow` or any other `orElseX`, we leave that
to `nextOptional().orElseThrow()`, etc. Then at iterator end, `nextOptional()`
returns `empty` forever. If there are `null`s, it returns `empty`. If you want
to know whether that is because there are many `null`s or because the iterator
is done, you call `hasNext()`.
Another way to put it: we shouldn't try to eliminate needing `hasNext()`
with this-- if we want to do that, we should do something like
`Spliterator::tryAdvance`, which is a whole different story. You can se how
that would work a little with `Iterator::forEachRemaining`. You don't need
`hasNext()` with that.
---