Extend Java iterators carefully when traversal needs filtering, peeking, or domain-specific movement without turning the cursor API into a grab bag.
Custom iterator enhancements can be useful, but they should remain coherent.
Enhance iterators only when the traversal contract genuinely needs richer cursor semantics. Otherwise, a stream, query object, or separate traversal service may be clearer.