В зависимости от размера вашего проекта, существует множество пакетов, которые легко справляются с отправкой формы, например: formik
, redux-form
, react-final-form
, если не считать нескольких. Но большинство из них используют ту же технику. Например, formik
правильно делает это, а также обрабатывает некоторые крайние случаи для вас, чтобы вам не пришлось беспокоиться.
Вкратце, я бы сказал, да, это лучший способ или, по крайней мере, способ реагирования, для обработки данных формы.
Можно использовать Iterator.remove()
, и при использовании entrySet итератора (Карты. Запись), можно использовать Map.Entry.setValue()
. Что-либо еще и все ставки прочь - Вы не должны изменять карту непосредственно, и некоторые карты не разрешат или или оба из вышеупомянутых методов.
А именно, Ваш (1), (2) и (3) не разрешены.
Вам могло бы сойти с рук устанавливание значения существующего ключа через Map
объект, но Set.iterator()
документация конкретно устраняет это, и это будет конкретная реализация:
Если карта изменяется, в то время как повторение по набору происходит (кроме через собственный итератор, удаляют операцию, или посредством setValue операции на записи карты, возвращенной итератором), результаты повторения не определены. (добавленный акцент)
Если Вы будете смотреть на класс HashMap, то Вы будете видеть поле, названное 'modCount'. Это - то, как карта знает, когда она была изменена во время повторения. Любой метод, который увеличивает modCount, когда Вы выполняете итерации, заставит это бросать ConcurrentModificationException.
Тем не менее Вы, CAN поместил значение в карту, если ключ уже существует, эффективно обновляя запись с новым значением:
Map<String, Object> test = new HashMap<String, Object>();
test.put("test", 1);
for(String key : test.keySet())
{
test.put(key, 2); // this works!
}
System.out.println(test); // will print "test->2"
Когда Вы спрашиваете, можно ли выполнить эти операции 'безопасно', Вы не должны волноваться слишком много, потому что HashMap разработан для броска того ConcurrentModificationException, как только он сталкивается с проблемой как это. Эти операции перестанут работать быстро; они не оставят карту в плохом состоянии.
В целом, если Вы хотите изменить Карту при итерации по нему, необходимо использовать один из методов итератора. Я на самом деле не протестировал, чтобы видеть, будет ли желание № 1 работать, но другие определенно не будут.
Нет никакого глобального ответа. Интерфейс карты позволил выбору пользователям. К сожалению, я думаю, что все реализации в jdk используют внедрение FAST сбоя (вот определение сбоя быстро, как это указало в HashMap Javadoc):
Итераторы, возвращенные всеми "методами просмотра набора этого класса", являются сбоем быстро: если карта структурно изменяется когда-либо после того, как итератор создается, всегда кроме через собственный итератор удаляют метод, итератор бросит ConcurrentModificationException. Таким образом, перед лицом параллельной модификации, итератор перестал работать быстро и чисто, вместо того, чтобы рискнуть произвольным, недетерминированным поведением в неопределенное время в будущем.