Ce face Set.ofLazy
Set.ofLazy(candidati, conditie) creează o mulțime care conține acele elemente din candidati pentru care conditie returnează true. La creare nu se calculează nimic. Când întrebi contains(x) pentru un candidat, condiția se evaluează o singură dată pentru x și rezultatul se păstrează.
Un element care nu este printre candidați nu face niciodată parte din mulțime, iar condiția nu se apelează pentru el. Operațiile care au nevoie de toate elementele (size(), parcurgerea) evaluează condiția pentru candidații rămași. Mulțimea este nemodificabilă și sigură între fire de execuție.
Atenție: în JDK 27 metoda face parte dintr-un API în previzualizare (preview, „lazy constants”). Se compilează și rulează doar cu --enable-preview (javac --release 27 --enable-preview Main.java, apoi java --enable-preview Main) și se poate schimba în versiunile următoare. Rezultatele de mai jos sunt dintr-o rulare reală cu aceste opțiuni.
Parametri
| Parametru | Descriere |
|---|---|
candidati |
Mulțimea elementelor posibile. |
conditie |
Funcția care decide, o singură dată pentru fiecare candidat, dacă acesta face parte din mulțime. |
Ce returnează
O mulțime nemodificabilă, calculată la cerere.
Exemple
Exemplul 1: Condiția se verifică o singură dată pe element
A doua întrebare despre „Bogdan” nu mai afișează „verific”. „Zoe” nu e candidat, deci condiția nu se apelează. size() verifică ultimul candidat rămas.
import java.util.Set;
import java.util.TreeSet;
public class Main {
public static void main(String[] args) {
Set<String> candidati = new TreeSet<>(Set.of("Ana", "Bogdan", "Cristina"));
Set<String> numeLungi = Set.ofLazy(candidati, n -> {
System.out.println("verific " + n);
return n.length() > 3;
});
System.out.println("creat");
System.out.println(numeLungi.contains("Bogdan"));
System.out.println(numeLungi.contains("Bogdan"));
System.out.println(numeLungi.contains("Ana"));
System.out.println(numeLungi.contains("Zoe"));
System.out.println(numeLungi.size());
System.out.println(new TreeSet<>(numeLungi));
}
}
Rezultat (rulat cu –enable-preview)
creat
verific Bogdan
true
true
verific Ana
false
false
verific Cristina
2
[Bogdan, Cristina]
Greșeli frecvente
- Compilezi fără
--enable-preview.javacrefuză codul, pentru căofLazyeste un API în previzualizare. - Te aștepți ca un element care nu este printre candidați să fie verificat cu condiția. Nu este;
containsreturnează directfalse. - Pui în condiție efecte care trebuie să se repete. Condiția rulează cel mult o dată pentru fiecare candidat.
Comenzi înrudite
Set.of: Creează o mulțime nemodificabilă din valorile date (of) sau dintr-o colecție existentă (copyOf). Ordinea nu este garantată.List.ofLazy: Listă nemodificabilă a cărei valoare de la fiecare poziție se calculează abia la prima citire, apoi se păstrează.Map.ofLazy: Map nemodificabil cu chei fixe, a cărui valoare pentru fiecare cheie se calculează abia la prima citire, apoi se păstrează.Set.contains: contains verifică rapid dacă un element este în mulțime; containsAll verifică dacă sunt toate elementele altei colecții.