Единственными допустимыми операциями для итератора являются приращение и разыменование (хотя Java Iterator
объединяет их в своем методе next()
).Если у вас есть немодифицируемый итератор, он оставляет только разыменование.Разыменование может дать вам ссылку на объект или может быть недопустимым для разыменования, поскольку оно не ссылается на допустимую позицию в коллекции.
Но это та же семантика, что и Optional
: Optional
может быть пустым или иметь допустимую ссылку на объект.Итак, создайте Optional
из Iterator
и используйте его в качестве «неизменяемого итератора»:
private Optional<T> unmodifiableNext(Iterator<T> i)
{
if (i.hasNext()) {
return Optional.ofNullable(i.next());
} else {
return Optional.empty();
}
}
Это дает дополнительное преимущество, заключающееся в том, что Optional
больше не являетсяпривязан к коллекции, поэтому коллекция может быть безопасно изменена без изменения того, к какому объекту относится Optional
.