Sobes.tech
Junior

Kokie yra būdai iteruoti per kolekcijas Java kalboje?

sobes.tech AI

Atsakymas iš AI

Java kalboje yra keletas būdų iteruoti per kolekcijas:

  • for ciklas su indeksu (tinka kolekcijoms, kurios palaiko indeksinę prieigą, pvz., ArrayList, LinkedList):
    Tinka kolekcijoms, kuriose indeksinė prieiga yra efektyvi.

    // Pavyzdys iteracijos per 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);
    }
    
  • Patobulintas for ciklas (Enhanced for loop / for-each loop):
    Labiausiai paplitęs ir patogus būdas daugeliu atvejų. Tinka bet kokioms kolekcijoms, kurios įgyvendina Iterable sąsają.

    // Pavyzdys iteracijos per ArrayList naudojant 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 naudojimas:
    Lankstesnis būdas, leidžiantis šalinti elementus iteracijos metu. Tinka visoms kolekcijoms.

    // Pavyzdys naudojant 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);
        // Saugiai galima šalinti elementus
        // if (element.equals("B")) {
        //     iterator.remove();
        // }
    }
    
  • ListIterator naudojimas (sąrašams):
    Specializuotas iteratorius, skirtas List sąsajai įgyvendinti. Leidžia judėti į priekį ir atgal, taip pat pridėti ir keisti elementus.

    // Pavyzdys naudojant 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);
    }
    // Judėjimas atgal
    while (listIterator.hasPrevious()) {
        String element = listIterator.previous();
        System.out.println(element);
    }
    
  • Streams API (nuo Java 8):
    Funkcinis požiūris naudojant lambda išraiškas. Leidžia atlikti operacijas su kolekcijos elementais (filtravimas, transformavimas ir kt.) deklaratyviu stiliumi. Iteracija vyksta "viduje" srauto.

    // Pavyzdys naudojant Streams API
    ArrayList<String> list = new ArrayList<>();
    list.add("A");
    list.add("B");
    list.add("C");
    
    list.stream()
        .forEach(element -> System.out.println(element));
    
    // Filtravimo ir transformavimo pavyzdys
    // list.stream()
    //     .filter(element -> element.startsWith("A"))
    //     .map(String::toLowerCase)
    //     .forEach(System.out::println);
    

Pasirinktas būdas priklauso nuo konkrečios užduoties, kolekcijos tipo ir reikalaujamos našumo. Daugeliu atvejų patogiausias yra patobulintas for ciklas. Jei reikia šalinti elementus iteracijos metu, naudokite Iterator. Sąrašams, kuriuose reikalingas dviejų krypčių iteravimas, tinka ListIterator. Streams API siūlo galingas galimybes duomenų apdorojimui deklaratyviu stiliumi.