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]