Sobes.tech
Junior

Koji su načini iteracije kroz kolekcije u Javi?

sobes.tech АИ

Одговор од АИ

Postoji nekoliko načina za iteraciju kroz kolekcije u Javi:

  • for petlja sa indeksom (za kolekcije koje podržavaju pristup putem indeksa, na primer ArrayList, LinkedList):
    Pogodno za kolekcije gde je pristup elementima putem indeksa efikasan.

    // Primer iteracije kroz 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);
    }
    
  • Proširena for petlja (Enhanced for loop / for-each loop):
    Najčešći i najzgodniji način. Pogodno za bilo koje kolekcije koje implementiraju interfejs Iterable.

    // Primer iteracije kroz ArrayList sa for-each
    ArrayList<String> list = new ArrayList<>();
    list.add("A");
    list.add("B");
    list.add("C");
    
    for (String element : list) {
        System.out.println(element);
    }
    
  • Korišćenje Iterator-a:
    Fleksibilniji način, omogućava brisanje elemenata tokom iteracije. Pogodno za sve kolekcije.

    // Primer iteracije sa `Iterator`-om
    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);
        // Može se sigurno brisati elemente
        // if (element.equals("B")) {
        //     iterator.remove();
        // }
    }
    
  • Korišćenje ListIterator (za liste):
    Specijalizovani iterator za kolekcije koje implementiraju interfejs List. Omogućava kretanje napred i nazad, kao i dodavanje i menjanje elemenata.

    // Primer iteracije sa `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);
    }
    // Primer iteracije unazad
    while (listIterator.hasPrevious()) {
        String element = listIterator.previous();
        System.out.println(element);
    }
    
  • Streams API (od Java 8):
    Funkcionalni pristup sa korišćenjem lambda izraza. Omogućava izvođenje operacija nad elementima kolekcije (filtriranje, transformacija itd.) na deklarativni način. Iteracija se dešava "unutra" u okviru toka.

    // Primer iteracije sa Streams API
    ArrayList<String> list = new ArrayList<>();
    list.add("A");
    list.add("B");
    list.add("C");
    
    list.stream()
        .forEach(element -> System.out.println(element));
    
    // Primer sa filtracijom i transformacijom
    // list.stream()
    //     .filter(element -> element.startsWith("A"))
    //     .map(String::toLowerCase)
    //     .forEach(System.out::println);
    

Izbor odgovarajućeg načina zavisi od konkretne zadatka, tipa kolekcije i zahteva za performanse. Za većinu slučajeva najzgodniji je prošireni for petlja. Ako je potrebno brisanje elemenata tokom iteracije, preporučuje se Iterator. Za liste gde je potrebna dvostrana iteracija, odgovara ListIterator. Streams API pruža moćne mogućnosti za obradu podataka na deklarativni način.