JavaRush /Blog Java /Random-PL /10 funkcji Java 8, o których nie słyszałeś

10 funkcji Java 8, o których nie słyszałeś

Opublikowano w grupie Random-PL
Lambdy, lambdy, lambdy. To wszystko, o czym słyszysz, gdy ludzie mówią o Javie 8. Ale to tylko jedna część. Java 8 ma wiele nowych funkcji — kilka nowych, potężnych klas i idiomów, a inne to po prostu rzeczy, które powinny być tam od początku. Chciałem przejść do dziesięciu nowych funkcji, które uważam za małe perełki, z którymi zdecydowanie warto się zapoznać. Na pewno będzie co najmniej jeden lub dwa spośród nich, które chciałbyś wypróbować, więc zaczynajmy! 1) Metody domyślne. Nowość w języku Java umożliwia teraz dodawanie treści metod do interfejsów ( metody domyślne ). Metody te są bezwarunkowo dodawane do wszystkich klas, które implementują te interfejsy. Daje to możliwość dodania nowej funkcjonalności do istniejących bibliotek bez psucia starego kodu. To zdecydowanie plus. Z drugiej strony poważnie zaciera granicę pomiędzy interfejsem, który obliguje do przestrzegania pewnych warunków w formie konwencji, a klasą, która je przestrzega, jako jego prywatną implementacją. W (prawych) prawych rękach może to być elegancki sposób na uczynienie interfejsów inteligentniejszymi, uniknięcie powtórzeń i rozszerzenie bibliotek. w złych rękach; wkrótce zobaczymy metody w interfejsach, które wywołują tę funkcję i rzutują ją na konkretny typ. Brrr.... 2) Zatrzymanie procesów. Uruchamianie dodatkowego procesu to jedna z rzeczy, które robisz, częściowo wiedząc, że wrócisz (debugujesz), aby go debugować, gdy proces (pęknie) (zawiesza się), przerywa, (zawiesza się), zawiesza się lub wykorzystuje 100% procesora. Klasa Process została teraz uzbrojona w dwie nowe metody pomagające kontrolować niesforne procesy. Pierwsza, isAlive() , pozwala łatwo sprawdzić, czy proces działa, bez konieczności czekania. Drugą i potężniejszą (uwaga!) jestzniszczForcibly () , która pozwala (bezwstydnie) na siłę (zabić) zatrzymać proces, który przekroczył swój czas (oczekiwanie lub z innego powodu) lub nie jest już potrzebny. 3) Opieczętowany zamek. A teraz coś naprawdę ekscytującego. Nikt nie lubi synchronizować kodu. Jest to niezawodny sposób na spowolnienie działania aplikacji (szczególnie na dużą skalę) lub, co gorsza, spowodowanie jej zawieszenia. A jednak czasami po prostu nie masz wyboru. Istnieje wiele idiomów synchronizujących wielowątkowy dostęp do zasobu. Jedną z najbardziej preferowanych jest ReadWriteLock i powiązane implementacje. Ten idiom ogranicza rywalizację, umożliwiając wielu wątkom korzystanie z zasobu, blokując jednocześnie tylko wątki manipulujące nim. Brzmi świetnie, ale w praktyce ta blokada jest strasznie powolna , szczególnie przy dużej liczbie piszących wątków. Okazało się to tak złe, że Java 8 wprowadziła nowy RWLock o nazwie StampedLock . Ta blokada jest nie tylko szybsza, ale oferuje także potężne API do blokowania optymistycznego, w którym można uzyskać blokadę odczytu niewielkim kosztem, mając nadzieję, że w krytycznych sekcjach kodu nie będą wykonywane żadne operacje pisemne. Na końcu tej sekcji pytasz blokadę, czy w tym czasie miało miejsce nagranie i w takim przypadku możesz zdecydować, czy spróbować ponownie, eskalować blokadę, czy też zrezygnować. Ten zamek jest potężnym narzędziem i zasługuje na wpis o sobie. Jestem niesamowicie podekscytowany tą nową zabawką. Świetnie! Dodatkowo możesz przeczytać Tutaj . 4) Konkurencyjne rejestratory. To kolejny mały klejnot dla każdego, kto korzysta z aplikacji wielowątkowych. Prosty i wydajny nowy interfejs API do odczytywania i zapisywania liczników z wielu wątków. Czasami jest to nawet szybsze niż użycie AtomicIntegers. Całkiem niesamowite! 5) Wartości opcjonalne (lub opcjonalne). Och, wskaźniki zerowe, ból głowy dla wszystkich programistów Java. Być może najpopularniejszy ze wszystkich wyjątków, istnieje już od bardzo wczesnych czasów. Przynajmniej od 1965 roku . Zapożyczając od Scali i Haskella, Java 8 ma nowy wzorzec, nazwany Opcjonalny, do zawijania odniesień, które mogą mieć wartość null. Nie jest to bynajmniej złoty środek, który usunie wartość null, ale raczej sposób dla projektantów API na wskazanie na poziomie kodu (zamiast dokumentacji), że wartość null może zostać zwrócona lub przekazana do metody, a osoba wywołująca musi przygotować się na to. Będzie to więc działać tylko w przypadku nowych interfejsów API, pod warunkiem, że obiekty wywołujące nie pozwolą referencjom na ucieczkę z opakowania, gdzie mogłoby to zostać niebezpiecznie wyłuskane. Muszę przyznać, że mam dość ambiwalentny stosunek do tej funkcji. Z jednej strony wartości zerowe pozostają ogromnym problemem, dlatego doceniam wszystko, co zostało zrobione, aby go rozwiązać. Z drugiej strony jestem dość sceptyczny, czy to się uda. Dzieje się tak dlatego, że korzystanie z opcji Opcjonalne wymaga ciągłego wysiłku całej firmy i ma niewielki bezpośredni wpływ. Bez zdecydowanego egzekwowania prawa istnieje duże prawdopodobieństwo, że pozostanie po lewej stronie drogi. Przeczytaj więcej na temat Opcjonalne . 6) Opisz wszystko. Kolejny mały postęp w języku Java: adnotacje można dodać do prawie wszystkiego w kodzie. Wcześniej adnotacje można było dodawać tylko do takich rzeczy, jak deklaracje klas lub metod. Od wersji Java 8 adnotacje można dodawać do deklaracji zmiennych i parametrów podczas rzutowania wartości na określony typ lub nawet przydzielania nowego obiektu. Jest to część skoncentrowanych wysiłków (wraz z ulepszeniami narzędzi JavaDoc i interfejsów API), których celem jest uczynienie języka bardziej przyjaznym dla narzędzi do analizy statycznej i pomiarów (takich jak FindBugs). To fajna funkcja, ale podobnie jak invokeDynamic wprowadzone w Javie 7, jej rzeczywista wartość będzie zależeć od tego, co z nią zrobi społeczeństwo. 7) Operacje przelewowe. Oto zestaw metod, która od pierwszego dnia powinna być częścią biblioteki podstawowej. Moim ulubionym hobby jest debugowanie przepełnień numerycznych, gdy int przekracza 2^32, i tworzenie najgorszych i najbardziej nieoczekiwanych błędów (tj. „Jak, u licha, otrzymuję tę dziwną wartość?”). Ponownie, nie ma tu złotego środka, ale jest mnóstwo funkcji do manipulowania liczbami, które wyrzucają się, gdy przepełnią się, w mniej wyrozumiały sposób niż standardowy operator +/*, który bezwarunkowo się przepełnia. 8) Przejdź się po katalogu. Iterowanie po zawartości drzewa katalogów od dawna jest jedną z rzeczy, które ludzie wyszukują w Google (w takim przypadku prawdopodobnie zostanie Ci doradzine użycie Apache.FileUtils). Java 8 unowocześnia klasę Files za pomocą dziesięciu nowych metod. Moją ulubioną jest metoda walk() , która tworzy leniwy wątek (ważny w przypadku dużych systemów plików) w celu iteracji po zawartości struktury katalogów. 9) Silne generowanie losowe. Obecnie nie brakuje rozmów na temat podatności haseł i kluczy. Bezpieczeństwo oprogramowania to złożony biznes i podatny na błędy. Dlatego podoba mi się nowa metoda SecureRandom. getinstanceStrong() , która automatycznie wybiera najsilniejszy generator losowy dostępny dla wirtualnej maszyny Java. Zmniejsza to ryzyko niepowodzenia lub posiadania słabego generatora, co sprawi, że klucze i zaszyfrowane wartości będą bardziej podatne na włamanie. 10. Data.doInstant(). Java 8 wprowadza zupełnie nowe API dla dat i godzin . Jest to całkiem zrozumiałe, ponieważ istniejący nie jest zbyt dobry. Joda od kilku lat zasadniczo zmierza w stronę interfejsu API Java w zakresie dat i godzin. Jednak nawet w przypadku nowego API pozostaje jeden duży problem - istnieje mnóstwo kodu i bibliotek korzystających ze starego API. I wszyscy wiemy, że tu zostaną. Więc, co zrobisz? Aby to osiągnąć, Java 8 zrobiła coś dość eleganckiego, dodając do klasy Date nową metodę o nazwie toInstant() , która konwertuje ją na nowy interfejs API. Pozwala to na szybkie przejście do nowego API, nawet podczas pracy z kodem korzystającym ze starego API (i będzie to kontynuowane w dającej się przewidzieć przyszłości).
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION