Stream.limit în Java

limit păstrează doar primele n elemente, iar skip sare peste primele n.

Sintaxă
Stream<T> limit(long maxim)
Stream<T> skip(long n)

Ce face Stream.limit

limit(n) lasă să treacă cel mult n elemente și apoi oprește stream-ul. Este modul obișnuit de a opri un stream infinit (iterate, generate) și de a afla „primele 3”, după o sortare.

skip(n) aruncă primele n elemente și le lasă pe celelalte. Împreună cu limit îți dă paginare: pagina p de mărime m este skip(p * m).limit(m).

Dacă stream-ul are mai puține elemente decât n, limit le dă pe toate, iar skip dă un stream gol. Valorile negative aruncă IllegalArgumentException.

Parametri

Parametru Descriere
maxim Câte elemente să păstreze limit.
n Câte elemente de la început să sară skip.

Ce returnează

Un stream mai scurt.

Exemple

Exemplul 1: Podiumul unui concurs

import java.util.Comparator;
import java.util.List;

public class Main {
    record Concurent(String nume, int puncte) {}

    public static void main(String[] args) {
        List<Concurent> lista = List.of(
                new Concurent("Ana", 87), new Concurent("Radu", 95), new Concurent("Ioana", 91),
                new Concurent("Dan", 78), new Concurent("Elena", 99));

        lista.stream()
                .sorted(Comparator.comparingInt(Concurent::puncte).reversed())
                .limit(3)
                .forEach(c -> System.out.println(c.nume() + " – " + c.puncte()));
    }
}

Rezultat

Elena – 99
Radu – 95
Ioana – 91

Exemplul 2: Paginare cu skip și limit

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

public class Main {
    public static void main(String[] args) {
        List<String> produse = IntStream.rangeClosed(1, 11).mapToObj(i -> "Produs " + i).toList();
        int marime = 4;
        for (int pagina = 0; pagina < 3; pagina++) {
            System.out.println("Pagina " + (pagina + 1) + ": "
                    + produse.stream().skip((long) pagina * marime).limit(marime).toList());
        }
    }
}

Rezultat

Pagina 1: [Produs 1, Produs 2, Produs 3, Produs 4]
Pagina 2: [Produs 5, Produs 6, Produs 7, Produs 8]
Pagina 3: [Produs 9, Produs 10, Produs 11]

Exemplul 3: Sari peste antetul unui fișier CSV

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> randuri = List.of("nume,oras", "Ana,Iași", "Mihai,Cluj", "Ioana,Brașov");
        randuri.stream()
                .skip(1)
                .map(r -> r.split(","))
                .forEach(c -> System.out.println(c[0] + " locuiește în " + c[1]));
    }
}

Rezultat

Ana locuiește în Iași
Mihai locuiește în Cluj
Ioana locuiește în Brașov

Greșeli frecvente

  • Pui limit înaintea lui sorted când vrei „primele 3 cele mai mari”. Obții primele 3 din listă, sortate; sortează întâi, apoi limitează.
  • Dai un număr negativ. limit(-1) și skip(-1) aruncă IllegalArgumentException.

Comenzi înrudite

  • Stream.takeWhile: takeWhile ia elemente cât timp condiția e adevărată și se oprește la primul care nu o respectă; dropWhile le sare pe acestea.
  • Stream.iterate: Creează un stream din formule: iterate pornește de la o valoare și aplică un pas, generate cere fiecare valoare unui Supplier.
  • Stream.sorted: Sortează elementele stream-ului, în ordinea naturală sau după un Comparator.
  • Stream.findFirst: Returnează primul element din stream (findFirst) sau oricare element (findAny), ca Optional.