Там действительно нет хорошего ответа. Итератор в Java специально применяется к коллекции дискретных элементов (объектов). Можно подумать, что String
, который реализует CharSequence
, должен быть «набором» дискретных символов. Вместо этого он рассматривается как единое целое, состоящее из символов.
В Java кажется, что итераторы действительно применяются только к коллекциям, а не к строке. Нет причин, почему это так (насколько я могу судить - вам, вероятно, придется поговорить с Гослингом или авторами API); это кажется соглашением или дизайнерским решением. Действительно, ничто не мешает CharSequence
реализовать Iterable
.
Тем не менее, вы можете перебирать символы в строке следующим образом:
for (int i = 0; i < str.length(); i++) {
System.out.println(str.charAt(i));
}
Или:
for(char c : str.toCharArray()) {
System.out.println(c);
}
Или:
"Java 8".chars().forEach(System.out::println);
Также обратите внимание, что вы не можете изменить символ строки на месте, потому что строки неизменны. Изменяемым компаньоном для String является StringBuilder (или более старый StringBuffer).
EDIT
Чтобы уточнить на основе комментариев к этому ответу. Я пытаюсь объяснить возможное обоснование , почему итератор в String
отсутствует. Я не пытаюсь сказать, что это невозможно; действительно, я думаю, что для CharSequence
имеет смысл реализовать Iterable
.
String
обеспечивает CharSequence
, что, хотя бы концептуально, отличается от String
. String
обычно рассматривается как единое целое, тогда как CharSequence
- это как раз последовательность символов. Было бы целесообразно иметь итератор для последовательности символов (то есть для CharSequence
), а не просто для самого String
.
Как правильно заметил Foxfire в комментариях, String
реализует интерфейс CharSequence
, поэтому для типов String
- это CharSequence
. С семантической точки зрения мне кажется, что это две разные вещи - я, вероятно, здесь педантичен, но когда я думаю о String
, я обычно думаю о нем как об одной сущности, которая, как оказалось, состоит из символов. Рассмотрим разницу между последовательностью цифр 1, 2, 3, 4
и числом 1234
. Теперь рассмотрим разницу между строкой abcd
и последовательностью символов a, b, c, d
. Я пытаюсь указать на эту разницу.
По моему мнению, спросить, почему у String
нет итератора, все равно, что спросить, почему у Integer
нет итератора, чтобы вы могли перебирать отдельные цифры.