Как работает Java для каждого цикла? - PullRequest
1384 голосов
/ 17 сентября 2008

Рассмотрим:

List<String> someList = new ArrayList<String>();
// add "monkey", "donkey", "skeleton key" to someList
for (String item : someList) {
    System.out.println(item);
}

Как будет выглядеть эквивалентный цикл for без использования для каждого синтаксиса ?

Ответы [ 26 ]

5 голосов
/ 29 ноября 2016

Как сказано в хороших ответах, объект должен реализовать Iterable interface, если он хочет использовать цикл for-each.

Я опубликую простой пример и попытаюсь по-другому объяснить, как работает for-each цикл.

Пример цикла for-each:

public class ForEachTest {

    public static void main(String[] args) {

        List<String> list = new ArrayList<String>();
        list.add("111");
        list.add("222");

        for (String str : list) {
            System.out.println(str);
        }
    }
}

Тогда, если мы используем javap для декомпиляции этого класса, мы получим следующий пример байт-кода:

public static void main(java.lang.String[]);
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=4, args_size=1
         0: new           #16                 // class java/util/ArrayList
         3: dup
         4: invokespecial #18                 // Method java/util/ArrayList."<init>":()V
         7: astore_1
         8: aload_1
         9: ldc           #19                 // String 111
        11: invokeinterface #21,  2           // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
        16: pop
        17: aload_1
        18: ldc           #27                 // String 222
        20: invokeinterface #21,  2           // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
        25: pop
        26: aload_1
        27: invokeinterface #29,  1           // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;

Как видно из последней строки примера, компилятор автоматически преобразует использование ключевого слова for-each в использование Iterator во время компиляции. Это может объяснить, почему объект, который не реализует Iterable interface, будет выбрасывать Exception при попытке использовать цикл for-each.

3 голосов
/ 02 мая 2018

Java для каждого цикла (он же расширен для цикла) является упрощенной версией цикла for. Преимущество состоит в том, что меньше кода для написания и меньше переменных для управления. Недостатком является то, что вы не можете контролировать значение шага и не имеете доступа к индексу цикла внутри тела цикла.

Лучше всего их использовать, когда значение шага является простым приращением 1 и когда вам нужен только доступ к элементу текущего цикла. Например, если вам нужно перебрать каждый элемент в массиве или коллекции, не заглядывая вперед или позади текущего элемента.

Нет инициализации цикла, нет логического условия, и значение шага неявно и является простым приращением. Вот почему они считаются намного проще, чем обычные для циклов.

Улучшено для циклов в следующем порядке:

1) тело петли

2) повторять с шага 1 до тех пор, пока не будет пройден весь массив или коллекция

Пример - целочисленный массив

int [] intArray = {1, 3, 5, 7, 9};
for(int currentValue : intArray) {
  System.out.println(currentValue);
}

Переменная currentValue содержит текущее значение, зацикленное в массиве intArray. Обратите внимание, что нет явного значения шага - оно всегда увеличивается на 1.

Можно предположить, что двоеточие означает «в». Таким образом, расширенные для объявления цикла состояния: зациклите intArray и сохраните текущее значение массива int в переменной currentValue.

Выход:

1
3
5
7
9

Пример - String Array

Мы можем использовать цикл for-each для итерации по массиву строк. Объявление цикла гласит: зациклите массив String myStrings и сохраните текущее значение String в переменной currentString.

String [] myStrings  = {
  "alpha",
  "beta",
  "gamma",
  "delta"
};

for(String currentString : myStrings) {
  System.out.println(currentString);
}

Выход:

alpha
beta
gamma
delta

Пример - Список

Расширенный цикл for также можно использовать для перебора java.util.List следующим образом:

List<String> myList = new ArrayList<String>();
myList.add("alpha");
myList.add("beta");
myList.add("gamma");
myList.add("delta");

for(String currentItem : myList) {
  System.out.println(currentItem);
}

Объявление цикла гласит: зацикливание списка строк myList и сохранение текущего значения списка в переменной currentItem.

Выход:

alpha
beta
gamma
delta

Пример - Установить

Усовершенствованный цикл for также можно использовать для перебора java.util.Set следующим образом:

Set<String> mySet = new HashSet<String>();
mySet.add("alpha");
mySet.add("alpha");
mySet.add("beta");
mySet.add("gamma");
mySet.add("gamma");
mySet.add("delta");

for(String currentItem : mySet) {
  System.out.println(currentItem);
}

Объявление цикла гласит: зацикливание набора строк mySet и сохранение текущего значения Set в переменной currentItem. Обратите внимание, что, поскольку это Set, повторяющиеся значения String не сохраняются.

Выход:

alpha
delta
beta
gamma

Источник: Циклы в Java - Ultimate Guide

3 голосов
/ 27 октября 2016
public static Boolean Add_Tag(int totalsize)
{ List<String> fullst = new ArrayList<String>();
            for(int k=0;k<totalsize;k++)
            {
              fullst.addAll();
            }
}
2 голосов
/ 08 июня 2015

Идиома Java for-each может применяться только к массивам или объектам типа * Итерируемый . Эта идиома неявная , поскольку она действительно поддерживается Итератором. Итератор программируется программистом и часто использует целочисленный индекс или узел (в зависимости от структуры данных) для отслеживания своей позиции. На бумаге он медленнее обычного цикла for, наименьший для «линейных» структур, таких как массивы и списки, но он обеспечивает большую абстракцию.

1 голос
/ 29 января 2018

Это выглядит безумно, но эй, это работает

List<String> someList = new ArrayList<>(); //has content
someList.forEach(System.out::println);

Это работает. Волшебное

0 голосов
/ 27 марта 2018
List<Item> Items = obj.getItems();
for(Item item:Items)
             {
                System.out.println(item); 
             }

Перебирает все объекты в таблице Items.

...