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ść to jest lekcja w trakcie której pokażę wam jak pisać
sobie bardziej skomplikowane wyrażenie regularne oczywiście nie jest to pełen kurs
pisania wyrażeń regularnych i to takich jeżeli chcecie nauczyć się pisać bardziej
skomplikowane wyrażenie i poznać w całości zagadnienie to odsyłam was was do
internetu i do zasobów tam zgromadzonych tutaj pokażę
wam jak pisać takie wyrażenia które możliwe że przydadzą w pozostałej
części kursu no więc zaczynajmy mam
tu odpalony kod z poprzedniej lekcji tutaj matchowaliśmy sprawdzaliśmy
czy wejściowy tekst jest pojedynczą liczbą okej
możemy to sobie rozbić w ten sposób napisać że to jest
od zera do dziewięciu i w ten sposób definiujemy że
alfabet którego się spodziewamy to jest liczba
od 0 do 9 tak cyfra tutaj jeżeli nie
podamy nic poza tym to regex zakłada że to
ma wystąpić dokładnie raz możemy sobie sprawdzić czy to działa to jest dokładnie to
samo co było wcześniej działa okej jak
podamy jakąś może nie d bo będzie się myliła
ale na przykład f no to już nam tutaj nie
zatrybi prawda no i teraz załóżmy że
chcemy tego mieć więcej to możemy wykorzystać sobie kilka
razy wrzucić tak to jest taka opcja trochę bruteforce'owa
23 ciach no
ale to się tak średnio skaluje dlatego istnieje coś takiego jak
kwantyfikator ilościowy i tutaj możemy sobie napisać że
ten poprzedni alfabet ma wystąpić dokładnie dwa
razy no i teraz też zadziała na
chwilę sobie wyrzućmy to co mieliśmy do tej pory i tak trochę poeksperymentujmy z tym jeżeli
tutaj coś sobie na przykład napiszę tutaj wpiszę asd i tutaj wpiszę asd
to on się spodziewa dokładnie tego co tutaj
wpisałem w tym regex'ie prawda jeżeli napiszę
asd no to on już tego
nie matchuje z tego względu że początek się okej zgadza ale cały regex
nie jest spełniony więc mogę tutaj albo dopisać d albo to co wcześniej
pokazałem mogę użyć tego kwantyfikatora i napisać że on występuje
no właśnie ile 3 razy dlaczego dlatego że ten kwantyfikator
który tutaj wpisujemy on się tyczy tego ostatniego
alfabetu bo to jest trochę nie jawnie coś takiego tak
wyspecyfikowany alfabet przy użyciu tych kwadratowych nawiasów tylko to jest
skrócone z tego względu że tam jest tylko jeden znak no i to nam zadziała
tutaj okej a co jeżeli bym chciał żeby
zmatchowało nam się coś takiego czyli na przykład mam to asd mam
3 razy no to żeby coś takiego zrobić to muszę tutaj stworzyć tak
zwaną grupę i ją tworzę przez okrągłe nawiasy i
teraz jak specyfikuję ilość to ten kwantyfikator
odnosi się do tego do całości tak i to już mi powinno zadziałać teraz
działa okej dobrze
teraz pokombinujmy trochę dalej na razie napisaliśmy taki regex
który za dużo sensu nie ma bo sprawdza jakiegoś czy występuje trzy razy w jakiś taki
losowy string a załóżmy że chcemy testować
wejściowe piny na przykład u nas w aplikacji użytkownik
podaje piny no i wpiszmy sobie taki pin a zaraz do niego ułożymy
jakiegoś regexa okej 1234 okej może to nie jest
świetny pin ale świetny do tego żeby zacząć się uczyć no i teraz jak
możemy sobie wyspecyfikować że chcemy
liczbę znaczy cyfra 0 do 9 i tutaj
chcemy ją dostać dokładnie 4 razy tak to teraz nam zespala działa okej
no oczywiście możemy to też skrócić do tego nie tak
do tej predefiniowanej klasy alfabetu
i wtedy możemy usunąć to z tego względu że to już ten kwantyfikator
będzie się odnosił do tego alfabetu tak też tam zadziała i
teraz co jeżeli chcemy żeby ten pin mógł mieć jeszcze dodatkowo jakiś cyfry
i żeby on dłuższy od trzech no to wtedy po prostu ten kwantyfikator
w tym kwantyfikatorze podajemy przecinek i
wtedy po prostu od czwórki w górę tak to działa możemy też
nie chcieć żeby w bazie były jakieś piny które są nie
wiadomo jak długie więc też ograniczymy sobie że powiedzmy że to jest od 4 do 10 i teraz
jak tutaj dodamy jeszcze sobie trochę
więcej tych znaków to on już tam tego nie złapie i teraz załóżmy że chcemy poza
poza cyframi mieć w tym pinie jeszcze jakieś znaki czyli
to będzie jakiś hasło w tym celu poeksperymentujmy sobie
trochę z tym alfabetem który zdefiniowaliśmy na razie co i przypominam że to było 0 9 po
prostu no i teraz załóżmy że jeszcze mogą być znaki czyli od a do z od a do z
dlaczego tak dlatego że domyślnie regex działa w trybie case-sensitive
więc musimy wymieniać w alfabecie i znaki wielkie i małe no
i teraz jak tutaj coś wpiszemy na przykład a nam się zmatchuje no i teraz takie
korporacyjne założenie może niech będzie że hasło musi się zaczynać od znaku który
nie jest cyfrą tak więc tutaj sobie wpiszmy a
na początek i teraz nam to się zmatchuje i
chcemy żeby to się matchowało okej ale żeby jeżeli
tutaj będzie jedynka na początek żeby już niekoniecznie jak
to zrobić możemy tutaj sobie po prostu skopiować tą część tego alfabetu
która nas interesuje która ma być na początek i wstawić ją tutaj sobie
też w kwadratowych nawiasach na początku to nam zadziała i jeszcze jedna
rzecz jeżeli tutaj na początek mamy przynajmniej jeden znak
obowiązkowy znaczy dokładnie jeden obowiązkowy znak a
ten kwantyfikator odnosi się do tego alfabetu to
warto żebyśmy tutaj zmniejszyli o 1 tak bo ten znak już już już musi być tak
więc teraz mamy dokładnie to co mieliśmy tylko z założeniem że
pierwszy jest znakiem a nie cyfrą i
prawidłowe hasło nam się zmatchuje teraz a jak wrzucimy tutaj na
przykład piątkę na początku no już niekoniecznie i super okej
dobra tak pokazałem jak trochę kombinować z tym alfabetem
jak kombinować z tą ilością wstąpienia alfabetu i
teraz pokażę wam jak wykorzystać alternatywę o
co z tym chodzi przyjmijmy sobie teraz na potrzeby przykładu że dostajemy
od użytkownika kod pocztowy okej i
napiszmy sobie do tego regexa tak zakładamy że on na początek musi mieć
dwa znaki które są cyfrą później musimy mieć znak
minusa i później też trzy cyfry i sprawdź czy to nam
działa działa i teraz o co chodzi chodzi o to że załóżmy
że ten minus po środku jest opcjonalny czyli użytkownik może
nam go wprowadzić z nim lub bez niego teraz jak tutaj go usuniemy to oczywiście nam to
nie zadziała i co możemy zrobić możemy właśnie użyć
sobie operatora alternatywy to jest taka
kreseczka w górę a i możemy po nim wpisać
regex który ma być jeszcze mamy go przetestować jeżeli ta
pierwsza część nie wyjdzie tak i tutaj możemy właśnie sobie wpisać
że mamy kod który składa się po
prostu z pięciu cyfr w ten sposób i
ten już teraz działa niezależnie czy mamy tego minusa czy nie okej
i teraz taka uwaga bo ta alternatywa
tutaj działa tak ale moglibyśmy
jej uniknąć dlaczego chcielibyśmy jej uniknąć
gdyby to było przyjmijmy sobie że to byłoby postaci
tych wejściowych może być 5 albo nie wiem więcej no
trochę używanie tej kreski może nam komplikować to wyrażenie i czasem da się jej uniknąć
oczywiście trzeba rozważyć czy to wyrażanie będzie wtedy prostsze
czy nie ale tutaj akurat możemy po prostu powiedzieć że ta kreseczka jest opcjonalna
czyli możemy usunąć sobie to co jest za znakiem alternatywy
i wpisać sobie tutaj że ilość tych
znaków minus jest od zera do jedynki i też intellij nam
od razu podpowie że ma na to że istnieje na to dobrze definiowana klasa to jest po prostu znak
zapytania czyli od zera do 1 i teraz to nam też zadziała czyli
napisaliśmy alternatywę żeby trochę zobaczyć jak to co możemy
z tym zrobić ale też akurat tu istniała istniało obejście a
jak to zapisać bez bez używania tej alternatywy okej
dobrze to tyle jeżeli chodzi o kod pocztowy teraz
korzystamy sobie trochę
pokombinujemy z wyszukiwaniem w
tekście i z takim kwantyfikatorem który pozwala na wyszukiwanie
po dowolnej liczbie znaków okej tutaj przygotowałem
nam taki tekst wejściowy to jest fragment z lorem ipsum to
jest taki tekst który używa się do testowania jakichś
blogów jakichś wyświetlaczy tekstu jakichś styl i teraz
załóżmy sobie że mamy jakiś jakiś wyraz tutaj na
przykład niech to będzie sit i chcemy sprawdzić czy on występuje
w danym tekście przy użyciu regexu moglibyśmy tutaj akurat w tym
wypadku sprawdzić to sprawdzić po prostu string contains ale załóżmy że to jakichś powodów
chcemy użyć regexa bo jest po prostu on trochę bardziej elastyczny teraz
jak wpiszemy tutaj sobie sit to ten program nam powie że ten
regex nie jest spełniony z tego względu że przed sit i po sit mamy
tutaj całą masę jakiś innych znaków i do tego możemy sobie użyć
po pierwsze alfabetu który jest składa
się z wszelkich znaków tutaj jeszcze jest kilka od
niego wyjątków ale o tym powiem później i kwantyfikatora który mówi
tutaj gwiazdeczka która mówi o tym że dany alfabet może wystąpić
zero razy lub więcej tak czyli zasadniczo może być dowolny tekst
w wypadku wcześniej no i po sit też powinniśmy
to sobie przekopiować sprawdźmy czy to się nam zmatchuje śmiga
okej i teraz załóżmy sobie że po sit mamy dowolną liczbę dowolnych
znaków po czym znowu jest jakieś wyspecyfikowane przez nas słowo
tak jakiś ciąg znaków i potem znowu dowolna liczba dowolnych
znaków może to wyglądać w ten sposób jak widzimy dalej działa załóżmy
teraz że nasz tekst może nie być jednoliniowy czyli może
zawierać znak newline i teraz zobaczymy czy nasz regex zmatchuje
ten tekst nie zmatchuje i teraz dlaczego tak się stało niby
tutaj wpiszemy że dowolne znaki dowolną
ilość razy wcześniej ale właśnie w tej kropce jest taki wyjątek
że ona może zawierać znak newline ale może go nie zależeć
od czego to zależy to zależy od pewnej flagi którą się podaje przy kompilowaniu regexu
możemy tutaj albo
dodać tę flagę albo możemy dopisać aby zostało uwzględnione również
newline możemy tutaj po prostu jawnie wpisać że
musi być newline wcześniej a to się nie zmatchowało bo tu jest jeszcze znak
spacji więc musimy tutaj dodać jeszcze to tak i teraz jest
i teraz jeszcze taka inna rzecz bo możemy też
pokusić się na dodanie czegoś takiego czyli
zrobienie uni kropki oraz n
ale nam to nie zadziała z tego względu że
z tego względu że on teraz tak to interpretuje
że ta kropka to jest faktyczna kropka w tekście ponieważ jesteśmy
w kontekście definiowania alfabetu więc on tego
nam nieporówna to ma to trochę sens bo w tej kropce jest wszystko
i tak więc dodawanie jej do tego kwadratowego
nawiasu by miało tylko sens w przypadku właśnie tym który mamy czyli dodawania
newline a to się po prostu ogarnia dodawając
odpowiednią flagę do kompilowania dodajmy teraz tą flagę to
usunę i ta flaga to jest pattern dotal i
dotal ma takie właśnie działanie że dodaje do kropki są kropka
uwzględnia wtedy również znaki nowej linii sprawdźmy czy nam to zadziała zadziała
nam okej teraz ze względu na to że kropka zawiera również znaki nowej
linii to ten tekst który tutaj mamy zmatchuje nam się niezależnie od tego czy ten znak nowej linii
jest czy nie tak mamy true teraz co zrobić jeżeli chcemy okej
chcemy matchować znaki nowej linii przez właśnie ten alfabet kropki
ale chcemy gdzieś wymusić że gdzieś newline
musi być po prostu tak tutaj usuńmy sobie tą spację żeby to nam nie
przeszkadzało właśnie takie wymuszenie znaku nowej
linii po prostu początku tekstu można wymusić poprzez
operator dash'a on wygląda w ten sposób tak
tutaj po prostu dajemy tutaj musi być znak nowej linii a tutaj
jeżeli chcemy żeby to była druga linia to musimy tutaj dać
plus zamiast gwiazdki z tego względu żeby tutaj coś było tak nawet znak chociażby
tutaj znak nowej linii ale i tak i teraz żeby tego użyć to jeszcze musimy
dodać jedną flagę do kompilacji jest to flaga multiline i
ona zawiera w sobie obsługę właśnie tego dasha oraz jeszcze znaku
końca linii który jest po prostu znakiem dolara my go tutaj nie potrzebujemy i teraz
sprawdźmy czy nam to się zmatchuje tak zmatchowało się okej i jeżeli usuniemy znak
nowej linii nie powinno nam się tutaj już złapać okej mamy false i tak to działa właśnie dobrze
to wszystko jeżeli chodzi o pisanie regexów tak jak mówiłem na początku
jeżeli chcecie bardziej poznać temat odsyłam was do innych kursów do
innych zasobów w internecie a to czego tutaj się nauczyłeś zdecydowanie
wystarczy do takiej podstawowej pracy z tym narzędziem oraz
zapewni jakąś taką bazę dzięki której będziemy mogli korzystać
z tych regexów przez resztę kursu do zobaczenia