Techniki Zaawansowane
8 godz. 35 min · Java · Full-stack i Programowanie
Rafał SolarskiW poczatkowych lekcjach przyjrzymy sie pokladowi, na jakim bedziemy uruchamiali nasze programy. Wykorzystamy VisualVM do podgladania parametrów JVM. Zobaczymy równiez jakie zasoby sa tam dostepne oraz dowiesz sie jak monitorowac to, czy dobrze z nich korzystamy. Opowiemy Ci tez miedzy innymi o tym, jak zrobic heap i thread dump, oraz jak wlaczyc logi GC.
Kolejne lekcje kursu zostaly poswiecone wyrazeniom regularnym. Wyrazenia regularne mozemy wykorzystac nie tylko do walidacji danych wprowadzania przez uzytkownika, ale równiez do dzielenia tekstu oraz wyluskiwania wystapien wzorców w duzym tekscie. W tym rozdziale dowiemy sie miedzy innymi tego, jak mozemy wykorzystac ten potencjal z poziomu Javy.
Dzieki typom generycznym jestesmy w stanie osiagnac bezpieczenstwo typów w trakcie kompilacji przy zachowaniu elastycznosci pisanego kodu. W nastepnym rozdziale kursu przyjrzymy sie temu, jak mozemy je wykorzystac, oraz w jaki sposób czasami nalezy z tego bezpieczenstwa zrezygnowac.
Interfejsy funkcyjne to sposób na przeniesienie odrobiny swiata programowania funkcyjnego do Javy. Gdy polaczymy je z wyrazeniami lambda oraz API strumieni pozwola nam pisac te sama logike w duzo bardziej przejrzysty sposób.
Kolekcje, czyli listy, mapy, zbiory i kolejki to jedne z najczesciej wykorzystywanych klas w codziennej pracy. To jak dobrze poznamy ich mozliwosci ma ogromny wplyw na to, w jaki sposób bedziemy podchodzili do rozwiazywania wyzwan na naszej drodze.
System plików to zasób bez którego ciezko sobie poradzic. Pozwalaja nam na dostarczanie konfiguracji, danych wejsciowych i wyjsciowych, a przez to równiez integrowanie ze soba calych systemów.W tym rozdziale nauczymy sie korzystac z tych dobrodziejstw w bezpieczny sposób wykorzystujac m.in. IO Streams.
Trzymanie daty w String to niekoniecznie najwygodniejszy sposób. Juz od pewnego czasu Java dysponuje bardzo wygodnym Date&Time API - zobaczymy, co mozemy w nim znalezc.
Wielowatkowosc nie jest prosta... i dlugo tak jeszcze pozostanie. Nawet jesli korzystamy z frameworków, które próbuja ja przed nami ukryc, to ciagle musimy byc swiadomi problemów jakie sie z nia wiaza. W tym rozdziale poznamy glówne problemy na jakie mozna natrafic programujac wielowatkowo w Javie. Poznamy równiez klasy, które zdecydowanie pomoga nam zapanowac nad ta zlozonoscia.
JDBC to najbardziej podstawowy sposób laczenia sie z baza SQL z poziomu Javy. W wielu systemach/aplikacjach stosuje sie rozwiazania ORM takie jak JPA/Hibernate. Mimo wszystko warto wiedziec jak to pod spodem dziala oraz umiec poradzic sobie w aplikacjach, gdzie wybrano bardziej "lekkie" podejscie niz Hibernate.
Na koniec kursu wykorzystamy zdobyta wiedze, aby stworzyc prosta aplikacje pozwalajaca na przechowywanie danych o wydatkach. Po stworzeniu coreu aplikacji, mozesz spróbowac uzupelnic go za pomoca GUI.
Ten kurs stworzony zostal przede wszystkim z mysla o osobach, które juz poznaly podstawy jezyka, takie jak zmienne, mechanizmy kontroli wykonania, klasy, typy generyczne.Jezeli chcesz poczuc sie swobodnie nie tylko jesli chodzi o mechanizmy jezyka, ale równiez pod wzgledem znajomosci standardowej biblioteki Javy - to kurs w sam raz dla Ciebie. Materialy beda przydatne dla studentów, którzy znaja juz podstawowa skladnie Javy; programistów Javy chcacych poszerzyc lub uporzadkowac swoja wiedze; programistów innych jezyków, którzy chca poznac inny stack technologiczny.
Cześć w tej lekcji pokażę ci jak pracować ze strumieniami
czym są strumienie oraz jak możesz je wykorzystać do łatwiejszej
pracy między innymi z kolekcjami dzięki temu poznasz
dużo prostszy zapis wielu operacji które do tej pory musieliśmy wykonywać na
pętlach zacznijmy od tego czym jest strumień strumień w swojej
najprostszej postaci jest to pewna sekwencja jakichś obiektów jakichś
danych ten strumień ma swoje źródło wewnątrz mogą
być jakieś operacje tak a następnie coś jest robione z
tymi danymi na przykład są one zapisywane do jakiejś kolekcji jest
wykonywane jakieś obliczanie na nich w każdym razie są
to jakieś dane które skądś i dokądś płyną oraz co ważne
strumienie w swojej naturze są lazy są leniwe tak
czyli jeżeli się okaże że część z tych danych nie będzie wcale potrzebne
na przykład interesuje nas pewna porządkowa liczba tych eventów jakichś
obiektów to dzięki temu możemy ograniczyć zużycie
zasobów i możliwe że te obiekty nigdy nie zostaną wyciągnięte nigdy
nie zostaną na nich wykonane jakieś metody które byłyby zbędne oczywiście to
wszystko zależy jak to zaimplementujesz teraz pokażę ci jak utworzyć najprostszy
strumień z integerów do utworzenia strumienia
wykorzystamy metodę of na klasie stream ta
metoda przyjmuje pewną tablice obiektów
w naszym wypadku będą to integery dzięki
temu że of ma tutaj wykorzystany operator arity tak
zwany możemy nie podawać tej tablicy tworząc
tej tablicy tylko możemy po prostu po przecinku wymienić obiekt tego samego typu w
tym momencie okej ten sposób utworzyliśmy stream on ma swój typ jak
każdy stream przechowuje jakieś obiekty w tym wypadku są
to obiekty klasy integer teraz zanim zaczniemy majstrować
przy tym strumieniu warto żebyśmy mogli wyświetlić jego zawartość wykorzystamy
do tego metody foreach która po prostu przyjmuje tutaj consumera czyli jak
pamiętamy z poprzedniej lekcji jest to interfejs funkcyjny który przyjmuje
accepta i przyjmuje parametr generycznego typu
tak czyli tu możemy po prostu albo wepchnąć jakąś lambdę z
jednym parametrem albo po prostu damy system out print line uchwyt
do tej metody okej zobaczymy co dostanie w wyniku takiego działania po prostu
listujemy każdy z elementów tego strumienia po kolei okej teraz co
ciekawszego możemy zrobić na takim na takim streamie zobaczmy co tutaj możemy wrzucić
pomiędzy of i foreach możemy tu przede
wszystkim użyć filtra jest to kolejny taki powiedzmy
krokiem co możemy na tym robić filtr tak jak już pokazywałem
istnieje taki interfejs jak predicate
predicate to jest interfejs funkcyjny który
posiada metodę test który przyjmuje jakiś generyczny typ który
jest też typem generycznym dla każdego z tych dla całego predykatu
tutaj możemy podać wyrażenie lambda
która pozwoli nam odfiltrować interesujące dane i to będzie e
i załóżmy że e musi być większe od dwóch okej widzimy
że teraz trzy cztery pięć tylko przeszło coś przez ten filtr i zostało
wyświetlane pozostałe dane zostały odfiltrowane teraz kolejną rzeczą którą
możemy wykonać na takim strumieniu jest metoda map operacja map tutaj
możemy wrzucić funkcje czyli interfejs funkcyjny który w swojej
metodzie przyjmuje jakiś obiekt jako
parametr oraz zwraca kolejny tak dzięki temu możemy przemapować
te obiekty na przykład do każdego z tych integerów możemy dodać
jeden plus jeden teraz mamy coś
takiego tak tutaj nic nie stoi na przeszkodzie żeby zwracać innego
typu obiekt na przykład string po prostu wtedy ten strumień w tym
miejscu zmieni swój typ tak tego obiektu wewnętrznego mogę to zrobić też
możemy zauważyć że właśnie mamy inny typ strumienia tak tutaj jest string teraz
okej teraz zmienię trochę typ wejściowych danych aby pokazać kolejną
rzecz teraz na wejściu strumienia mamy obiekty klasy string wykorzystam
je do zaprezentowania metody flatmap która
jest też wykorzystywana do przemapowywania obiektów
w streamie ale tak jak ma[ przyjmował jakiś element
i zwracał jeden element innego bądź tego samego typu o
tyle flat map przyjmuje funkcję która dostaje element strumienia na
której jest wywoływany oraz zwraca inny
strumień który może być innego typu tak innego inny
może być typ tych obiektów które są przechowywane w tym streamie i teraz o co chodzi o
ile w mapie dostawaliśmy jeden element i wypluwaliśmy jeden element to wykorzystując
flatmap możemy zmienić liczebność elementów w streamie możemy
powiedzieć żeby z jednego dostać na przykład zero elementów i wtedy tak
jakbyśmy od filtrowali ten element ale też możemy dodać
kolejne elementy na przykład jeżeli jednym z
elementu stream'a jest lista to możemy sprawić
aby w kolejnym tak jakby kolejnym typie tego strumienia
już nie była tylko że był strumień złożony
z wszystkich elementów wszystkich list które były poprzednimi elementami
tego strumienia tutaj zaprezentujemy to sobie akurat na stringach
załóżmy że chcemy dostać w kolejnym w strumieniu nie
poszczególne słowa tylko dostać każdy ze znaków który
się znajduje w tej w tych stringach tak no okej zróbmy to w ten
sposób na wejściowym elemencie e
to jest string wywołajmy sobie chars
chars zwraca nam string ale nie jest to jeszcze to co nas interesuje chcielibyśmy
dostać tutaj char string z tego względu użyjmy sobie
funkcji metody map to object jest pewna taka zawiłość którą
później wytłumaczę wynikająca z tego że są streamy
które są na typy prymitywne albo powiedzmy udając
stream na typy prymitywne oraz są streamy
na obiekty tutaj dostaliśmy stream int'ów
więc przemapujmy go sobie na stream który będzie zawierał zrzutowane
elementy obiektu char character to jest dokładnie
coś takiego po prostu uruchommy okej jak widzimy dostaliśmy strumień
elementów poszczególnych tutaj poszczególne litery dostaliśmy a nawet znaki
możemy użyć operacji filter aby odfiltrować sobie puste charactery
stąd możemy to sobie zrobić poprzez wywołanie też
map tutaj i na przykład podając jako tą
funkcję tutaj uchwyt do metody trim w ten sposób
odfiltrujemy sobie te tutaj te skrajne spacje jak w środku jestem
to musimy po prostu sobie zrobić tutaj filter i wewnątrz predykatu
sprawdzić sobie czy ten znak który jest w środku nie jest
spacją po prostu tak może to wyglądać na przykład w ten sposób kolejną operacją
którą możemy wykonywać na strumieniu jest zliczanie
obiektów w tym celu już nie będziemy wywoływali foreach a tylko zrobimy po prostu count
oraz wyświetlimy wynik tak mam 11 elementów następnie możemy
też na strumieniu wywołać find first i teraz jest taka fajna rzecz
find first bez względu na to że ten strumień może nie zawierać w
ogóle elementów tak czyli dostaliśmy jakąś zmienn albo strumień
skąd inąd i nie wiemy ile jest w nim elementów może być na przykład pusty to
find first nie zwraca pierwszego elementu lub null'a tylko zwraca tak zwanego
optionala można to tłumaczyć jako listę która może zawierać
od zera do jednego element później w rozdziale o kolekcjach jeszcze
bardziej się przyjrzymy dokładniej temu elementowi jakim jest optional
na razie możemy po prostu sobie zrobić jeżeli jest on obecny w
środku ten element tak to możemy go wyświetlić no wygląda to w ten sposób tak
dostaliśmy b i teraz skoro możemy wyciągnąć sobie pierwszy element to warto też
pokazać że strumieniem możemy sobie posortować możemy zrobić sorted na tym tak i
dostaliśmy a teraz również możemy odwrócić to sortowanie wtedy
wystarczy podać komparator tak te jeżeli sortujemy
podając komparator to w przypadku natural order
należy podać co to jest za element on sam
nie jest w stanie się do tego domyślić w tym miejscu okej i dostaliśmy r możemy
też wywołać różne takie metody warto sobie przejrzeć jak już tutaj są między innymi min
max kolejnym fajnym feature'em stream'ów jest
to że możemy łatwo je wykorzystywać do pracy z kolekcjami zobacz
sobie jaki ten zapis jest zgrabny i teraz zamiast
podawać tutaj stream of i jakiś array możemy też wykorzystać jakąś
listę bądź dowolną kolekcję z tego względu że
collection ten interface posiada metodę stream który konwertuje
daną kolekcję do streamu tutaj stworzyłem sobie właśnie listę wykorzystałem
przy tym metodę fabrykująca as list warto jej
używać na przykład pisząc testy i tutaj wystarczy wywołać stream aby
można korzystać z tych wszystkich dobrodziejstw takich jak map flatmap
i tak dalej poza tym że możemy zamienić listę na stream to możemy zamienić
też ją na parallel stream ten parallel stream to jest coś o czym
opowiem w kolejnych odcinkach w kolejnych lekcjach poza tym że możemy
stworzyć stream z listy czy jakiejś innej kolekcji to
warto też móc zapisać ten stream z powrotem do na przykład listy do tego
wykorzystujemy operację collect jeżeli nawet idea podpowiada że
jest collectors to list więc nam po prostu zmienia ten stream w listę
characteru w tym momencie są też inne kolektory
predefiniowane w klasie collectors między innymi to map jest
też bardzo fajny taki collector grouping by okej to
tyle jeżeli chodzi o wstęp w kolejnych lekcjach nauczymy się co jeszcze możemy
zrobić ze strumieniami aby nasza praca była wydajniejsza dzięki wielkie i
do zobaczenia