Spis treści
Przedmowa
Część I. Podstawy programowania funkcyjnego
1. Wprowadzenie do programowania funkcyjnego
Co sprawia, że język jest funkcyjny?
Koncepcje programowania funkcyjnego
Funkcje czyste i transparentność referencyjna
Niemutowalność
Rekurencja
Typy pierwszoklasowe i funkcje wyższego rzędu
Kompozycja funkcyjna
Rozwijanie funkcji
Częściowe zastosowanie funkcji
Ewaluacja leniwa
Zalety programowania funkcyjnego
Wady programowania funkcyjnego
Podsumowanie
2. Funkcyjna Java
Czym są wyrażenia lambda Javy?
Składnia wyrażeń lambda
Interfejsy funkcyjne
Wyrażenia lambda i zmienne zewnętrzne
A co z klasami anonimowymi?
Instrukcja invokedynamic
Wyrażenia lambda w działaniu
Tworzenie wyrażeń lambda
Wywoływanie wyrażeń lambda
Odwoływanie się do metod
Koncepcje programowania funkcyjnego w Javie
Funkcje czyste i transparentność referencyjna
Niemutowalność
Typy pierwszoklasowe
Kompozycja funkcyjna
Ewaluacja leniwa
Podsumowanie
3. Interfejsy funkcyjne pakietu JDK
Cztery główne kategorie interfejsów funkcyjnych
Funkcje
Konsumenty
Dostawcy
Predykaty
Dlaczego jest tak wiele wariantów interfejsu funkcyjnego?
Argumentowość funkcji
Typy proste
Wypełnianie luki między interfejsami funkcyjnymi
Kompozycja funkcyjna
Rozszerzanie wsparcia funkcyjnego
Dodawanie metod domyślnych
Bezpośrednie implementowanie interfejsu funkcyjnego
Tworzenie statycznych metod pomocniczych
Podsumowanie
Część II. Podejście funkcyjne
4. Niemutowalność
Mutowalność i struktury danych w OOP
Niemutowalność (nie tylko) w programowaniu funkcyjnym
Stan niemutowalności Javy
java.lang.String
Niemutowalne kolekcje
Typy proste i obiektowe typy opakowujące
Niemutowalna matematyka
Java Time API (JSR-310)
Typy wyliczeniowe
Słowo kluczowe final
Rekordy
Jak osiągnąć niemutowalność?
Powszechne praktyki
Podsumowanie
5. Praca z rekordami
Typy agregacji danych
Krotki
Prosty POJO
Od POJO do niemutowalności
Od POJO do rekordu
Rekordy na ratunek
Mechanizmy wewnętrzne
Funkcjonalności rekordu
Brakujące funkcjonalności
Przypadki użycia i powszechne praktyki
Walidacja rekordów i oczyszczanie danych
Zwiększanie poziomu niemutowalności
Tworzenie zmodyfikowanych kopii
Rekordy jako lokalne krotki nominalne
Lepsza obsługa opcjonalnych danych
Serializowanie ewoluujących rekordów
Dopasowywanie wzorców rekordów (od Javy 19)
Jeszcze kilka słów na temat rekordów
Podsumowanie
6. Przetwarzanie danych za pomocą strumieni
Przetwarzanie danych za pomocą iteracji
Iteracja zewnętrzna
Iteracja wewnętrzna
Strumienie jako funkcyjne potoki danych
Funkcjonalności strumieni
Spliterator, kręgosłup strumieni
Budowanie potoków strumieniowych
Tworzenie strumienia
Wykonywanie pracy
Kończenie strumienia
Koszt operacji
Modyfikowanie zachowania strumienia
Używać strumienia czy nie?
Podsumowanie
7. Praca ze strumieniami
Strumieniowe typy proste
Strumienie iteracyjne
Strumienie nieskończone
Liczby losowe
Pamięć nie jest nieskończona
Od tablic do strumieni i z powrotem
Tablice typu obiektowego
Tablicowe typy proste
Niskopoziomowe tworzenie strumieni
Praca z operacjami we-wy plików
Odczytywanie zawartości katalogów
Przechodzenie katalogów w głąb
Przeszukiwanie systemu plików
Odczytywanie plików linia po linii
Zastrzeżenia dotyczące strumieni z operacjami we-wy plików
Obsługa daty i czasu
Kwerendowanie typów czasowych
Strumienie z zakresem LocalDate
Pomiar wydajności strumienia za pomocą narzędzia JMH
Kolektory
Kolektory downstreamowe
Tworzenie własnego kolektora
Jeszcze kilka słów na temat strumieni (sekwencyjnych)
Podsumowanie
8. Równoległe przetwarzanie danych za pomocą strumieni
Współbieżność a równoległość
Strumienie jako równoległe potoki funkcyjne
Strumienie równoległe w akcji
Kiedy używać, a kiedy unikać strumieni równoległych?
Wybór odpowiedniego źródła danych
Liczba elementów
Operacje strumieniowe
Koszty ogólne strumienia i dostępne zasoby
Przykład – jeszcze raz Wojna i pokój
Przykład – liczby losowe
Lista kontrolna dla strumieni równoległych
Podsumowanie
9. Obsługa wartości null za pomocą typów Optional
Problem z zerowymi referencjami
Jak obsługiwać wartość null w Javie (przed wprowadzeniem Optional)?
Najlepsze praktyki w zakresie obsługi wartości null
Kontrole null z użyciem narzędzi
Typy wyspecjalizowane, takie jak Optional
Typy opcyjne na ratunek
Czym jest Optional?
Tworzenie potoków opcyjnych
Opcje i strumienie
Typy opcyjne jako elementy strumienia
Operacje terminalne strumieni
Opcyjne typy proste
Zastrzeżenia
Opcje są zwykłymi typami
Metody uwzględniające tożsamość
Narzut związany z wydajnością
Szczególne kwestie dotyczące kolekcji
Opcje i serializacja
Jeszcze kilka słów na temat referencji null
Podsumowanie
10. Obsługa wyjątków funkcyjnych
Obsługa wyjątków Javy w pigułce
Blok try-catch
Różne rodzaje wyjątków i błędów
Wyjątki sprawdzane w wyrażeniach lambda
Wyodrębnianie kodu do postaci bezpiecznych metod
Anulowanie sprawdzania wyjątków
Sneaky throws
Funkcyjne podejście do wyjątków
Nierzucanie wyjątków
Błędy jako wartości
Wzorzec Próba, Powodzenie, Niepowodzenie
Jeszcze kilka słów na temat funkcyjnej obsługi wyjątków
Podsumowanie
11. Ewaluacja leniwa
Porównanie leniwości i gorliwości
Jak gorliwa jest Java?
Ewaluacja minimalna
Struktury sterowania
Leniwe typy pakietu JDK
Wyrażenia lambda i funkcje wyższego rzędu
Podejście gorliwe
Podejście bardziej leniwe
Podejście funkcyjne
Opóźnianie wykonywania za pomocą typu Thunk
Tworzenie prostego typu Thunk
Thunk bezpieczny dla wątków
Jeszcze kilka słów na temat leniwości
Podsumowanie
12. Rekurencja
Czym jest rekurencja?
Porównanie rekurencji głowowej i ogonowej
Rekurencja i stos wywołań
Bardziej złożony przykład
Iteracyjne przechodzenie drzewa
Rekurencyjne przechodzenie drzewa
Strumienie rekurencyjne
Jeszcze kilka słów na temat rekurencji
Podsumowanie
13. Zadania asynchroniczne
Porównanie zadań synchronicznych i asynchronicznych
Typy Future Javy
Projektowanie potoków asynchronicznych przy użyciu typu CompletableFuture
Obiecywanie wartości
Tworzenie instancji CompletableFuture
Komponowanie i łączenie zadań
Obsługa wyjątków
Operacje terminalne
Tworzenie metody pomocniczej CompletableFuture
Ręczne tworzenie i rozwiązywanie
Ręczne tworzenie
Ręczne rozwiązywanie
Przypadki użycia dla ręcznie utworzonych i ukończonych instancji
Pule wątków i limity czasu
Jeszcze kilka słów na temat zadań asynchronicznych
Podsumowanie
14. Funkcyjne wzorce projektowe
Czym są wzorce projektowe?
(Funkcyjne) wzorce projektowe
Wzorzec Metoda Wytwórcza
Wzorzec Dekorator
Wzorzec Strategia
Wzorzec Budowniczy
Jeszcze kilka słów na temat funkcyjnych wzorców projektowych
Podsumowanie
15. Funkcyjne podejście do Javy
Porównanie zasad OOP i FP
Funkcyjny sposób myślenia
Funkcje są typami pierwszoklasowymi
Unikanie skutków ubocznych
Funkcyjne przetwarzanie danych za pomocą mapowania, filtrowania i redukcji
Implementacje opierają się na abstrakcjach
Budowanie funkcyjnych pomostów
Ułatwienie równoległości i współbieżności
Uwaga na potencjalny narzut
Architektura funkcyjna w świecie imperatywnym
Od obiektów do wartości
Separacja zagadnień
Różne rozmiary FC/IS
Testowanie FC/IS
Jeszcze kilka słów na temat funkcyjnego podejścia do Javy
Podsumowanie
Opinie
Na razie nie ma opinii o produkcie.