Sobes.tech
Junior

Care sunt modalitățile de a itera peste colecții în Java?

sobes.tech AI

Răspuns de la AI

În Java, există mai multe moduri de a itera peste colecții:

  • Buclă for cu index (pentru colecții care suportă accesul pe bază de index, cum ar fi ArrayList, LinkedList):
    Potrivit pentru colecții în care accesul pe bază de index este eficient.

    // Exemplu de iterare pe 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);
    }
    
  • Buclă for extinsă (Enhanced for loop / for-each):
    Cel mai comun și convenabil mod pentru majoritatea cazurilor. Potrivit pentru orice colecție care implementează Iterable.

    // Exemplu de iterare pe ArrayList cu for-each
    ArrayList<String> list = new ArrayList<>();
    list.add("A");
    list.add("B");
    list.add("C");
    
    for (String element : list) {
        System.out.println(element);
    }
    
  • Utilizarea iteratorului (Iterator):
    Mod mai flexibil care permite eliminarea elementelor în timpul iterării. Potrivit pentru toate colecțiile.

    // Exemplu de iterare cu 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);
        // Se pot elimina elemente în siguranță
        // if (element.equals("B")) {
        //     iterator.remove();
        // }
    }
    
  • Utilizarea ListIterator (pentru liste):
    Iterator specializat pentru colecțiile care implementează List. Permite navigarea înainte și înapoi, precum și adăugarea și modificarea elementelor.

    // Exemplu de iterare cu 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);
    }
    // Exemplu de iterare înapoi
    while (listIterator.hasPrevious()) {
        String element = listIterator.previous();
        System.out.println(element);
    }
    
  • Streams API (din Java 8):
    Abordare funcțională folosind expresii lambda. Permite efectuarea de operații asupra elementelor colecției (filtrare, transformare etc.) într-un mod declarativ. Iterarea are loc "intern" în flux.

    // Exemplu de iterare cu Streams API
    ArrayList<String> list = new ArrayList<>();
    list.add("A");
    list.add("B");
    list.add("C");
    
    list.stream()
        .forEach(element -> System.out.println(element));
    
    // Exemplu cu filtrare și transformare
    // list.stream()
    //     .filter(element -> element.startsWith("A"))
    //     .map(String::toLowerCase)
    //     .forEach(System.out::println);
    

Alegerea metodei depinde de sarcina specifică, tipul colecției și cerințele de performanță. Pentru cele mai multe cazuri, bucla for extinsă este cea mai convenabilă. Dacă este necesar să eliminați elemente în timpul iterării, trebuie utilizat Iterator. Pentru liste care necesită o iterare bidirecțională, este potrivit ListIterator. API-ul Streams oferă posibilități puternice pentru procesarea datelor într-un mod declarativ.