Sobes.tech
Middle

Do czego służą strumienie w nowej wersji Javy?

sobes.tech AI

Odpowiedź od AI

Strumienie w Java 8+ służą do deklaratywnego przetwarzania sekwencji danych. Pozwalają na wykonywanie operacji funkcyjnych na kolekcjach (listach, zbiorach), tablicach lub innych źródłach danych w stylu potoku.

Główne zalety korzystania ze strumieni:

  • Styl deklaratywny: Pozwalają opisać "co" trzeba zrobić z danymi, a nie "jak". To czyni kod bardziej czytelnym i zrozumiałym.
  • Leniwe obliczenia: Operacje są wykonywane tylko wtedy, gdy jest to konieczne, co może poprawić wydajność, szczególnie przy dużych ilościach danych.
  • Przetwarzanie równoległe: Strumienie można łatwo równoleglać (używając parallelStream()), co pozwala efektywnie wykorzystywać procesory wielordzeniowe.
  • Zmniejszenie ilości kodu szablonowego: Zastępują tradycyjne pętle i iteratorów bardziej wyrazistymi i zwartymi konstrukcjami.
  • Niezmienność: Strumienie nie zmieniają źródła danych.

Przykłady powszechnych operacji na strumieniach:

  • Filtrowanie: filter() - wybór elementów na podstawie warunku.
  • Przekształcanie (mapowanie): map() - przekształcenie każdego elementu.
  • Sortowanie: sorted() - sortowanie elementów.
  • Unikalne elementy: distinct() - usuwanie duplikatów.
  • Grupowanie: collect(Collectors.groupingBy(...)) - grupowanie elementów po cechach.
  • Statystyki/Aggregacja: count(), sum(), average(), max(), min(), reduce() - operacje agregujące.
  • Zbieranie do kolekcji: collect(Collectors.toList()), collect(Collectors.toSet()) - zbieranie wyników do kolekcji.

Przykład użycia:

// Filtrowanie i przekształcanie listy stringów za pomocą strumieni
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");

List<String> filteredNames = names.stream() // Tworzymy strumień z listy
                                   .filter(name -> name.startsWith("A")) // Filtrowanie: pozostaw tylko nazwy zaczynające się na "A"
                                   .map(String::toUpperCase) // Przekształcanie: każda nazwa na wielkie litery
                                   .collect(Collectors.toList()); // Zbieranie wyniku do nowej listy

System.out.println(filteredNames); // Wypisze: [ALICE]