Java цикл foreach

236
11 мая 2018, 15:25

Есть функция foo, которая возвращает массив bar. Будет ли одинакова последовательность работы у цикла foreach, если в качестве иттерируемого объекта передать foo и bar? Будет ли вызваться функция foo каждый раз или условно закешируется?

Answer 1

Работать будет одинаково. При вызове for (Object a : foo()) {} у вас сначала один раз вызовется метод, по результату которого пойдёт итерирование. foreach - всего лишь "синтаксический сахар" для создания итератора и дальнейшего его использования. Т.е. "под капотом" это:

Iterator it = foo().iterator();
while(it.hasNext()) {
    it.next();
}
Answer 2

В Java нет цикла foreach, есть for, за исключением stream api - где действительно есть метод forEach.
Но это немного другое.
Если поместить функцию, которая не кеширует результат в переменной или объекте, она будет вызываться при каждой итерации.

final String str = "text;

Плохой цикл:

for (int i = 0; i < str.length(); ++i) {
   // .......
}

Хороший цикл:

for (int i = 0, max = str.length(); i < max; ++i) {
   // .......
}
READ ALSO
Проблемы с созданием адаптера для RecyclerView

Проблемы с созданием адаптера для RecyclerView

При попытке создать адаптер для RecyclerView возникают проблемы:

215
XML from URL XmlPullParser

XML from URL XmlPullParser

Просьба не ругать сильно, с XML не работал, только учусьПока иду от простого XmlPullParser что бы понять принцип работы

267
Проблемы с запуском приложения

Проблемы с запуском приложения

При запуске приложения в студии на устройстве появляется: Waiting For Debugger-сообщение, хотя режим отладки в студии не включал, а делал обычный запускКак...

261
сохранить файл после его изменения в textarea

сохранить файл после его изменения в textarea

Как изменить пользовательский файл после того как его изменил сам пользователь в textarea? Вот код сервлета, где выводится файл пользователя...

215