Как создать неизменный итератор? - PullRequest
0 голосов
/ 21 февраля 2019

Если у меня есть карта или список, и я получаю из нее итератор, например:

var map = new HashMap();
var iterator = map.entrySet().iterator();

, если что-то изменит эту карту после факта, повлияет ли это на итератор или итератор в основном неизменныйпосле создания?

Если это не является неизменяемым, как создать неизменяемый итератор?

1 Ответ

0 голосов
/ 21 февраля 2019

Единственными допустимыми операциями для итератора являются приращение и разыменование (хотя 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.

...