IntStream.range în Java

Creează șirul de numere întregi dintre două limite: range fără ultima valoare, rangeClosed cu ea inclusă.

Sintaxă
static IntStream range(int start, int sfarsitExclus)
static IntStream rangeClosed(int start, int sfarsitInclus)

Ce face IntStream.range

IntStream.range(0, 5) dă numerele 0, 1, 2, 3, 4: începutul este inclus, sfârșitul nu. Este echivalentul lui for (int i = 0; i < 5; i++) și se potrivește cu indicii unei liste: range(0, lista.size()).

IntStream.rangeClosed(1, 5) include și ultima valoare: 1, 2, 3, 4, 5. Este potrivit pentru numărări „de la 1 la n”. Dacă începutul este mai mare decât sfârșitul, stream-ul este gol (nu numără înapoi).

Parametri

Parametru Descriere
start Primul număr (inclus).
sfarsitExclus / sfarsitInclus Ultima limită: exclusă la range, inclusă la rangeClosed.

Ce returnează

Un IntStream ordonat, crescător cu pasul 1.

Exemple

Exemplul 1: range față de rangeClosed

import java.util.Arrays;
import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        System.out.println(Arrays.toString(IntStream.range(0, 5).toArray()));
        System.out.println(Arrays.toString(IntStream.rangeClosed(1, 5).toArray()));
        System.out.println("Suma 1..100 = " + IntStream.rangeClosed(1, 100).sum());
        System.out.println("Invers (gol): " + IntStream.range(5, 0).count());
    }
}

Rezultat

[0, 1, 2, 3, 4]
[1, 2, 3, 4, 5]
Suma 1..100 = 5050
Invers (gol): 0

Exemplul 2: Indici pentru o listă

Cu range(0, size()) avem acces la poziție, ca să numerotăm clasamentul.

import java.util.List;
import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        List<String> clasament = List.of("Ioana", "Ana", "Radu");
        IntStream.range(0, clasament.size())
                .mapToObj(i -> (i + 1) + ". " + clasament.get(i))
                .forEach(System.out::println);
    }
}

Rezultat

1. Ioana
2. Ana
3. Radu

Exemplul 3: Tabla înmulțirii cu 7

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        IntStream.rangeClosed(1, 5)
                .forEach(i -> System.out.println("7 x " + i + " = " + 7 * i));
    }
}

Rezultat

7 x 1 = 7
7 x 2 = 14
7 x 3 = 21
7 x 4 = 28
7 x 5 = 35

Greșeli frecvente

  • Folosești range(1, 10) și te aștepți să apară 10. Pentru limita inclusă scrie rangeClosed(1, 10).
  • Încerci să numeri înapoi cu range(10, 0): stream-ul e gol. Folosește map(i -> 10 - i) sau IntStream.iterate(10, i -> i > 0, i -> i - 1).

Comenzi înrudite

  • IntStream: Un stream de numere int simple, cu sum, average, min, max; IntStream.of îl creează direct din valori.
  • for: Bucla clasică cu contor: inițializare, condiție verificată înaintea fiecărui pas și actualizare după fiecare pas.
  • Stream.iterate: Creează un stream din formule: iterate pornește de la o valoare și aplică un pas, generate cere fiecare valoare unui Supplier.
  • IntStream.mapToObj: Trece de la numere int la obiecte: mapToObj transformă fiecare număr într-un obiect, boxed îl împachetează în Integer.