Джава. Функциональный подход. Расширение объектно-ориентированного кода Java с помощью правил
Товар
- 0 раз купили
- 0 оценка
- 2 осталось
- 0 отзывов
Доставка
Характеристики
Описание
Java. Podejście funkcyjne. Rozszerzanie obiektowego kodu Javy o zasady programowania funkcyjnego
Ben Weidig
Aby napisać dobry kod, programiści muszą wybrać optymalnye sposóoby rozwiązania danego problemu. Java jest znana ze skutecznego i przetestowanego podejścia obiektowego (OOP), jednak ten paradygmat ten nie zawsze okazuje się wystarczający. Zamiast wymuszaćnia zasad OOP w każdym wprzypadku, warto wdrożyć w swoim kodzie zasady programowania funkcyjnego (FP), aby zapewnić sobie najlepsze korzyści płynące ze stosowania tych 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 i dlaczego używać takich opcjifunkcjonalności, jak niemutowalność i funkcje czyste i dlaczego warto to robićw swojej codziennej pracy. Poznasz różnetakie aspekty FP:, jak kompozycjęa, ekspresyjność, modułowość, wydajność i efektywne manipulowanie danymi. Nauczysz się również wykorzystać zywania FP w celudla zapewnienia wyższego bezpieczeństwa i łatwiejszego utrzymywania kodu. Teo wszystkieo pozwoli Ci zdobyć cenne umiejętności, które 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 zastosowaniakorzystania z nich
- rozszerzanie kodu Javy o aspekty funkcjonalności 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.
O autorze
Ben Weidig jest programistą samoukiem. Od niemal 20 lat tworzy strony internetowe i różne aplikacje w kilku językach programowania. Jest też autorem licznych artykułów o Javie, programowaniu funkcyjnym ioraz o najlepszych praktykach kodowania. Bierze również udział w projektach open source.
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
Гарантии
Гарантии
Мы работаем по договору оферты и предоставляем все необходимые документы.
Лёгкий возврат
Если товар не подошёл или не соответсвует описанию, мы поможем вернуть его.
Безопасная оплата
Банковской картой, электронными деньгами, наличными в офисе или на расчётный счёт.