Sobes.tech
Middle

Dlaczego w nowej wersji Javy używane są strumienie?

sobes.tech AI

Odpowiedź od AI

Użycie strumieni w nowszych wersjach Javy (począwszy od Java 8) wynika z kilku powodów związanych z wydajnością, czytelnością kodu i przetwarzaniem danych równoległych:

  • Programowanie funkcyjne: Strumienie pozwalają pisać kod w bardziej deklaratywnym stylu, koncentrując się na co trzeba zrobić z danymi, a nie jak. To poprawia czytelność i utrzymanie.
  • Przetwarzanie równoległe: Strumienie ułatwiają równoległe wykonywanie operacji na kolekcjach za pomocą parallelStream(). JVM zarządza podziałem danych i łączeniem wyników, upraszczając tworzenie wielowątkowych aplikacji.
  • Wydajność: Opóźniona ewaluacja (lazy evaluation) w strumieniach oznacza, że operacje są wykonywane tylko wtedy, gdy jest to konieczne, co zmniejsza koszty. Operacje pośrednie (map, filter) nie są wykonywane od razu, aż do wywołania operacji terminalnej (collect, forEach).
  • Lepsza obsługa kolekcji: Dostarczają zestaw standardowych i wysokopoziomowych operacji do filtrowania, mapowania i agregacji danych w kolekcjach, co zmniejsza ilość powtarzalnego kodu z pętlami.
  • Operacje niezmienne: Strumienie nie zmieniają oryginalnej kolekcji, z której są tworzone, wspierając zasady niezmienności i ułatwiając debugowanie.
// Przykład użycia strumieni do filtrowania i mapowania
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");

List<String> filteredNames = names.stream() // Tworzenie strumienia
                                  .filter(name -> name.startsWith("C")) // Filtrowanie
                                  .map(String::toUpperCase) // Mapowanie
                                  .collect(Collectors.toList()); // Zbieranie do nowej listy

System.out.println(filteredNames); // Wypisuje: [CHARLIE]

Strumienie równoległe:

// Przykład przetwarzania równoległego w strumieniu
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

int sum = numbers.parallelStream() // Tworzenie równoległego strumienia
                   .mapToInt(Integer::intValue) // Konwersja na IntStream
                   .sum(); // Sumowanie

System.out.println(sum); // Wypisuje: 55 (może być szybciej obliczane na systemach wielordzeniowych)