Szczegóły ebooka

Java. Podejście funkcyjne. Rozszerzanie obiektowego kodu Javy o zasady programowania funkcyjnego

Java. Podejście funkcyjne. Rozszerzanie obiektowego kodu Javy o zasady programowania funkcyjnego

Ben Weidig

Ebook

Aby napisać dobry kod, programiści muszą wybrać optymalny sposób rozwiązania danego problemu. Java jest znana ze skutecznego i przetestowanego podejścia obiektowego (OOP), jednak ten paradygmat nie zawsze okazuje się wystarczający. Zamiast wymuszać OOP w każdym wypadku, warto wdrożyć w swoim kodzie zasady programowania funkcyjnego (FP), aby zapewnić sobie najlepsze korzyści płynące ze stosowania obydwóch paradygmatów.

Dzięki tej książce zrozumiesz bazowe koncepcje programowania funkcyjnego i przekonasz się, że możesz włączać je do kodu bez rezygnacji z paradygmatu obiektowego. Dowiesz się również, kiedy w swojej codziennej pracy używać takich opcji jak niemutowalność i funkcje czyste i dlaczego warto to robić. Poznasz różne aspekty FP: kompozycję, ekspresyjność, modułowość, wydajność i efektywne manipulowanie danymi. Nauczysz się korzystać z FP w celu zapewnienia wyższego bezpieczeństwa i łatwiejszego utrzymywania kodu. Te wszystkie cenne umiejętności ułatwią Ci pisanie bardziej zwięzłego, rozsądnego i przyszłościowego kodu.

W książce między innymi:

  • zasady programowania funkcyjnego
  • przegląd typów programowania funkcyjnego dostępnych w Javie
  • różne koncepcje FP i sposoby ich zastosowania
  • rozszerzanie kodu Javy o aspekty FP bez przechodzenia na pełną funkcyjność
  • jak doskonalić swój styl programowania niezależnie od języka lub paradygmatu

To obowiązkowa lektura dla każdego programisty, który chce poprawić swoje umiejętności i pozostać na bieżąco z trendami w programowaniu! 

A.N.M. Bazlur Rahman, inżynier oprogramowania i mistrz Javy

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
  • Tytuł: Java. Podejście funkcyjne. Rozszerzanie obiektowego kodu Javy o zasady programowania funkcyjnego
  • Autor: Ben Weidig
  • Tytuł oryginału: A Functional Approach to Java: Augmenting Object-Oriented Java Code with Functional Principles
  • Tłumaczenie: Lech Lachowski
  • ISBN: 978-83-289-0652-5, 9788328906525
  • Data wydania: 2024-02-20
  • Format: Ebook
  • Identyfikator pozycji: japofu
  • Wydawca: Helion