Sobes.tech
Junior

Чӣ гуна роҳҳои такрор дар коллексияҳо дар Java ҳастанд?

sobes.tech AI

Ҷавоб аз AI

Дар Java има няколко начина за итерация през колекции:

  • Цикъл for с използване на индекс (за колекции, които поддържат достъп чрез индекс, например ArrayList, LinkedList):
    Подходящ за колекции, където достъпът до елементите чрез индекс е ефективен.

    // Пример за итерация през ArrayList
    ArrayList<String> list = new ArrayList<>();
    list.add("A");
    list.add("B");
    list.add("C");
    
    for (int i = 0; i < list.size(); i++) {
        String element = list.get(i);
        System.out.println(element);
    }
    
  • Разширен for цикъл (Enhanced for loop / for-each loop):
    Най-често използваният и удобен начин. Подходящ за всякакви колекции, реализиращи интерфейса Iterable.

    // Пример за итерация през ArrayList с използване на for-each
    ArrayList<String> list = new ArrayList<>();
    list.add("A");
    list.add("B");
    list.add("C");
    
    for (String element : list) {
        System.out.println(element);
    }
    
  • Използване на Iterator:
    По-гъвкав начин, позволяващ изтриване на елементи по време на итерацията. Подходящ за всички колекции.

    // Пример за итерация с използване на `Iterator`
    ArrayList<String> list = new ArrayList<>();
    list.add("A");
    list.add("B");
    list.add("C");
    
    Iterator<String> iterator = list.iterator();
    while (iterator.hasNext()) {
        String element = iterator.next();
        System.out.println(element);
        // Може безопасно да се изтриват елементи
        // if (element.equals("B")) {
        //     iterator.remove();
        // }
    }
    
  • Използване на ListIterator (за списъци):
    Специализиран итератор за колекции, реализиращи интерфейса List. Позволява движение напред и назад, както и добавяне и промяна на елементи.

    // Пример за итерация с използване на `ListIterator`
    ArrayList<String> list = new ArrayList<>();
    list.add("A");
    list.add("B");
    list.add("C");
    
    ListIterator<String> listIterator = list.listIterator();
    while (listIterator.hasNext()) {
        String element = listIterator.next();
        System.out.println(element);
    }
    // Пример за итерация назад
    while (listIterator.hasPrevious()) {
        String element = listIterator.previous();
        System.out.println(element);
    }
    
  • Streams API (от Java 8 нататък):
    Функционален подход с използване на lambda изрази. Позволява извършване на операции върху елементите на колекцията (филтриране, преобразуване и др.) по декларативен начин. Итерацията се извършва "вътрешно" в рамките на потока.

    // Пример за итерация с използване на Streams API
    ArrayList<String> list = new ArrayList<>();
    list.add("A");
    list.add("B");
    list.add("C");
    
    list.stream()
        .forEach(element -> System.out.println(element));
    
    // Пример с филтриране и преобразуване
    // list.stream()
    //     .filter(element -> element.startsWith("A"))
    //     .map(String::toLowerCase)
    //     .forEach(System.out::println);
    

Изборът на подходящия начин зависи от конкретната задача, типа на колекцията и изискванията за производителност. За повечето случаи най-удобен е разширеният for цикъл. Ако е необходимо изтриване на елементи по време на итерацията, трябва да се използва Iterator. За списъци, където е необходима двупосочна итерация, подходящ е ListIterator. Streams API предлага мощни възможности за обработка на данни по декларативен начин.