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ść wiemy już jakie klasy mamy do dyspozycji w
przypadku pracy z czasem w javie a w tej lekcji spróbujemy wykorzystać
je trochę w praktyce przede wszystkim nauczymy się jak sparsować
datę w postaci jakiejś takiej stringowej oraz jak sprasować kiedy ta
data różni się od domyślnego formatowania na początek mam
tutaj jakiś taki pliczek mamy tutaj jakąś datę w iso tak
datę czas offset plus jeden tak oraz
mamy przecinek i później jest kolejna kolumna zawierająca jakąś wartość jakiegoś
integera może tu jest temperatura co prawda
ona się dość porządnie waha w każdym razie jest to jakaś jakaś liczba integer
z jakiegoś zakresu okej załóżmy że chcemy sobie wczytać ten pliczek
on nie jest zbyt długi ma 1000 linii chcemy go sobie wrzucić
na przykład na heap i chcemy go posortować na przykład po dacie na przykład odwrotnie
tak teraz widzimy że one są w tej przerastają chcemy żeby było w drugą stronę okej
w tym celu sobie sparsujemy i datę i ten powiedzmy
tą wartość wrócimy do jakiegoś tak do jakiejś takiej prostej
klasy javowej która zawiera tylko dwie wartości tak no
i później to posortujemy okej w pierwszej kolejności może jeżeli chcemy to parsować
to utwórzmy sobie jakąś klasę w której będziemy to przechowywali i niech to będzie
sample i utworzymy w niej 2 pola niech to będzie time i value
jako że nie wiemy jaka to jest dokładnie strefa czasowa załóżmy że to jest
jakaś strefa czasowa o stałym offsecie tak czyli wykorzystajmy offset
date time tak tutaj jeszcze stworzyłem konstruktor oraz gettery a
też zauważ że dodałem final z tego względu że nie ma potrzeby modyfikowania
wartość tego obiektu po jego stworzeniu to nie stworzyłem setterów tak
te pola są finalowe i dzięki temu mamy obiekt który jest niemutowalny
okej mamy już powiedzmy pojos'a czyli tego pain java object
który będzie zawierał wartości z tego z każdej linijki tego pliku
teraz wczytajmy sobie jedną wartość tak jedną linię z pliku oraz
napiszmy do niej metodę która będzie ją parsowała czyli zamieniała tą
reprezentacji tekstową wyciągniętą z tego pliku na już na obiekt javowy
tak wczytamy pierwszą linię tak mamy albo pierwszą linię z tego pliku
albo jak zaczyn i teraz napiszmy jakąś metodę która nam sparsuje to niech ta
metoda nazywa się parse okej i w tej metodzie dostajemy linie oraz
chcemy stworzyć obiekt klasy sample zauważmy że ta linia to jest linia
z pliku csv tak czyli powiedzmy poszczególne kolumny
w nim są rozdzielone przecinkiem po prostu tak więc
najlepiej byłoby wziąć te linie ją zesplitować używając
regex'a po prostu po znaku przecinka tak w ten sposób dostaniemy
po prostu tablice poszczególnych elementów podzielonych właśnie
przez przez ten separator teraz wiemy że parse pod
zerowym elementem pod zerowym indeksem będzie się znajdowała data tak czyli
zapiszmy ją sobie tutaj do jakiejś to będzie raw date raw time oraz
parts pod indeksem 1 będzie się znajdowała ta
wartość tak to wszystko jest w stringu na razie tak zaraz to sobie sparsujemy odpowiednio
okej zacznijmy od czasu bo jest on ciekawszy dzięki temu że format
w tym pliku jest to format iso bardzo łatwo go sobie sformatujemy
używając po prostu offset date time parse tak
że po prostu podajemy tą linię to znaczy ten fragment który
chcemy sparsować pierwszą kolumnę zapiszmy to sobie tutaj do time
załóżmy że wartości które się znajdują w raw value
tak to są wartości które się mieszczą w zakresie integera więc po prostu
sparsujmy sobie używając metody fabrykującej intager tak
tu mamy parse int i podajemy tego stringa tak okej mamy jedno
i drugie pole więc możemy utworzyć teraz sample podajemy podajemy odpowiednio
czas i value okej napisaliśmy metodę która nam parsuje jedną linię
z tego pliku to jeszcze metoda parse musi być
statyczna tak bo wołamy go z main'a który jest statyczny okej
i wyprintujemy sobie co ona zwróci nam w tym momencie ona zwróci nam obiekt
sample więc też w sample dodajmy sobie jakiegoś to
stringa który nam ładnie przedstawił jakie wartości się znajdują w tym obiekcie tak
więc sobie wygenerujmy intellij to stringa on nas spyta po prostu
których pól użyć w tym to stringu okej okej widzimy że już
wewnątrz mamy obiekt klasy offset date time tak
oraz wartość minus 13 to wszystko nam się sparsowało
zobaczymy czy te wartości się zgadzają tak to jest dokładnie to samo okej
a teraz zamiast parsować jedną linię po prostu z sparsujemy cały plik i
te sparsowane obiekty sample wrzućmy sobie do jakiś kolekcji tak ze względu
że wiemy że ten plik nie jest zbyt duży możemy sobie pozwolić na wrzucenie tego
wszystkiego na heap okej tutaj po prostu w mapie na lines
lines zwraca nam tutaj strumień stringów tak wywołałem po prostu
na mapie parse a następnie zrobiłem collect na tym wszystkim dzięki temu mamy wszystkie
powiedzmy sparsowane te obiekty sample w jednej liście tak
tutaj one są okej a teraz zamiast je wrzucać powiedzmy do listy powiedzmy że chcemy
jeszcze posortować tak czyli tutaj wywołamy jeszcze sort
tak sorted i tutaj z tego względu że chcemy posortować
to po dacie to możemy albo zrobić sample jako comparible
tak czyli rozszerzyć tutaj extends comparable tak
to jeszcze to nie powinno być tylko extends tylko implement tak i tutaj podać
comparable jakby od czego taki tutaj zwracać 1 bądź minus 1
bądź 0 tak jeżeli są obiekty równe po prostu możemy wziąć
tutaj tę datę ten time który mamy w polu i zrobić na
nim compare to i tutaj ten drugi tak i z niego
wyciągnąć datę i teraz jak to odpalimy nam to się posortuje jest nawet w tej samej
kolejności dokładnie ponieważ powiedzmy te daty są przyrastające w tym
pliku jeżeli chcemy to zrobić inaczej to możemy tutaj wziąć komparator
i zrobić na nim reversed musimy jeszcze tylko sprecyzować do
czego ma być ten natural order bo inaczej się kompilator nie połapie i taka
uwaga natural order możemy użyć tylko wtedy jeżeli to
co tutaj mamy w środku to jest coś co jest comparable
tak inaczej możemy powiedzmy zaimplementować tutaj komparator w postaci
na przykład lambdy okej udało nam się to posortować i widzimy jest to ciąg malejący
teraz załóżmy że data w naszym pliku ma inny format jest na początek
godzina a później jest the tak jakaś litera a później jest
powiedzmy właśnie dopiero data tak czyli odwrotnie trochę niż w iso
później nasz value jeżeli chcemy sparsować taki taką datę
to musimy już teraz wykorzystywać przeciążenie metody parse która przyjmuje
jako parametr formater różne formatery potrafią
wczytać różne formaty daty tak musimy stworzyć nasz customowy ponieważ
ten format jest też taki nietypowy tek w tym celu tworzymy date
time formatter i najlepiej wykorzystać w tym momencie metodę
ofpattern to wyrażenie które nie jest regexem posiada
jednak pewne oznaczenia które fragmenty mają być dopasowane do których
fragmentów w dacie tak czyli będziemy wyznaczali na przykład że poszczególne
elementy są na przykład godziną dniem
i tak dalej okej dobra najlepiej tutaj sobie wklejmy w
tym momencie jak wygląda jeden wiersz z naszego piku tutaj
wyrzućmy value okej i teraz po kolei lecimy tak żeby nam się
sparsowało wyrażenie do tego co tutaj mamy na początek mamy
godzinę tak hh duże
tak z tego względu że tutaj są chcemy
żeby ta dwunastka na przykład tutaj żeby ta godzina co tutaj jest też
jeżeli jest 02 tak tu też żeby powiedzieć to w naszym formacie zostało uwzględnione
dlatego 2 h okej i później jest dwukropek
tak tak jak tutaj i później jest mm tak czyli minuta
razem z tym padding 0 tak czyli jeżeli jest pierwsza
minuta to jest 01 ciągle okej co później mamy
później mamy plus i tutaj jest zona w tym momencie zona
to jest x w tym wypadku tak czyli to
jest zona wyrażona w iso tak to plus 1 plus 1 dwukropek
00 lub na przykład z jako tak okej
i później jest jakiś d które ma oznaczać że później
jest data tak powiedz mi jak tam było przy iso oczywiście jest wymyślone
nie ma takiego formatu okej i tutaj powiedzmy
jeżeli chcemy żeby w formacie był jakiś literał czyli powiedzmy jakiś
tekst żeby ten format uwzględniał tak że tutaj może coś takiego wystąpić lub przy wypisywaniu
on ma coś takiego wstawić nadajemy tutaj takie ciapki tak
okej i później jest rok czterocyfrowy czyli cztery y i myślnik
teraz miesiąc tak też z tym 0 i
później mary po prostu day dd tak okej zobaczymy
czy tak utworzony formater teraz nam to sparsuje okej jak widzimy cały
plik został sparsowany nie było z tym problemu okej i teraz załóżmy
że poza tym że potrafimy sformatować plik który ma daty w jakimś takim
dziwacznym formacie teraz musimy wyświetlić te wyniki użytkownikowi gdzieś w
jakimś interfejsie i zobaczymy teraz w tej robię to stringa
niejawnie albo robi printline i zobaczymy jak to obecnie wygląda
na razie tak to jest wyświetlane tak ja tu zrobiłem to string i jest to po prostu
format iso i powiedzmy że chcemy się pozbyć tych myślników chcemy mieć
zamiast tego slash i nie chcemy mieć tego t na przykład chcę ukryć zonę
w tym momencie tak mogę sobie zmieńmy nazwę tego formatera na jakąś inną
no tak i dodajemy drugi który po prostu będzie służył do wyświetlania
tak czyli print date time formatter ok
tutaj chcemy trochę mieć inny format to sobie zamienimy kolejnością
w ogóle zamiast myślników stawiamy slasha okej tutaj tego
nie podajemy już godzina tak minuty nie
chcemy strefy czyli usuwamy tego x oraz ten
też usuwamy tak bo to był jakiś literał i teraz tego obiektu możemy
użyć tutaj tak tego formatera wywołać
na nim format okej czyli reasumując potrafimy przeczytać
plik jakiego on by tam powiedzmy formatowania tej daty nie miał powiedzmy dokładne
jakie tutaj elementy możemy wykorzystać przy tym pisaniu tego wyrażenia znajdziemy
w dokumentacji oracle do javy oraz
wiemy też jak wyświetlić tę datę w postaci na jakiej nam zależy
tak na te lekcje to wszystko dzięki wielkie i do zobaczenia