prominent java 8 features with code examples
Obszerna lista i wyjaśnienie wszystkich najważniejszych funkcji wprowadzonych w wydaniu Java 8 wraz z przykładami:
jak zainicjować listę w java
Wydanie Java 8 firmy Oracle było rewolucyjną wersją pierwszej na świecie platformy programistycznej. Obejmował ogromną aktualizację do modelu programowania Java jako całości, a także ewolucję JVM, języka Java i bibliotek w skoordynowany sposób.
To wydanie zawierało kilka funkcji zapewniających łatwość obsługi, produktywność, ulepszone programowanie w poliglocie, bezpieczeństwo i ogólną poprawę wydajności.
Czego się nauczysz:
- Funkcje dodane do wydania Java 8
- Funkcjonalne interfejsy i wyrażenia lambda
- forEach () w interfejsie iterowalnym
- Klasa opcjonalna
- Metody domyślne i statyczne w interfejsach
- Odniesienia do metod
- Java Stream API do zbiorczych operacji na danych na kolekcjach
- Java Date Time API
- Silnik JavaScript Rhinoceros
- Dekodowanie kodowania Base64
- Ulepszenia interfejsu API kolekcji
- Zmiany / ulepszenia interfejsu API współbieżności
- Ulepszenia Java IO
- Różne ulepszenia podstawowego interfejsu API
- Wniosek
Funkcje dodane do wydania Java 8
Poniżej wymieniono najważniejsze funkcje dodane do tej wersji.
- Funkcjonalne interfejsy i wyrażenia lambda
- forEach () w interfejsie iterowalnym
- Klasa opcjonalna,
- metody domyślne i statyczne w interfejsach
- Odniesienia do metod
- Java Stream API do zbiorczych operacji na danych w kolekcjach
- Java Date Time API
- Ulepszenia interfejsu API kolekcji
- Ulepszenia interfejsu API współbieżności
- Ulepszenia Java IO
- Silnik JavaScript Rhinoceros
- Dekodowanie kodowania Base64
- Różne ulepszenia podstawowego interfejsu API
W tym samouczku omówimy pokrótce każdą z tych funkcji i spróbujemy wyjaśnić każdą z nich za pomocą prostych i łatwych przykładów.
Funkcjonalne interfejsy i wyrażenia lambda
Java 8 wprowadza adnotację znaną jako @FunctionalInterface, która zwykle dotyczy błędów na poziomie kompilatora. Jest zwykle używany, gdy interfejs, którego używasz, narusza umowy dotyczące interfejsu funkcjonalnego.
Alternatywnie, interfejs funkcjonalny można wywołać jako interfejs SAM lub interfejs pojedynczej metody abstrakcyjnej. Funkcjonalny interfejs dopuszcza jako składową dokładnie jedną „metodę abstrakcyjną”.
Poniżej podano przykład interfejsu funkcjonalnego:
@FunctionalInterface public interface MyFirstFunctionalInterface { public void firstWork(); }
Możesz pominąć adnotację, @FunctionalInterface, a Twój interfejs funkcjonalny nadal będzie prawidłowy. Używamy tej adnotacji tylko po to, aby poinformować kompilator, że interfejs będzie miał jedną metodę abstrakcyjną.
Uwaga: Z definicji metody domyślne nie są abstrakcyjne i możesz dodać dowolną liczbę metod domyślnych w interfejsie funkcjonalnym.
Po drugie, jeśli interfejs ma abstrakcyjną metodę, która zastępuje jedną z publicznych metod „java.lang.object”, nie jest uważana za abstrakcyjną metodę interfejsu.
Poniżej podano prawidłowy przykład interfejsu funkcjonalnego.
@FunctionalInterface public interface FunctionalInterface_one { public void firstInt_method(); @Override public String toString(); //Overridden from Object class @Override public boolean equals(Object obj); //Overridden from Object class }
Wyrażenie lambda (lub funkcję) można zdefiniować jako funkcję anonimową (funkcja bez nazwy i identyfikatora). Wyrażenia lambda są definiowane dokładnie w miejscu, w którym są potrzebne, zwykle jako parametr innej funkcji.
Z innej perspektywy wyrażenia Lambda wyrażają wystąpienia Funkcjonalne interfejsy (opisane powyżej). Wyrażenia lambda implementują jedyną abstrakcyjną funkcję obecną w interfejsie funkcjonalnym, a tym samym implementują interfejsy funkcjonalne.
Podstawowa składnia wyrażenia lambda to:
Podstawowym przykładem wyrażenia Lambda jest:
Powyższe wyrażenie przyjmuje dwa parametry xiy i zwraca ich sumę x + y. Bazując na typie danych xiy, metoda może być używana wielokrotnie w różnych miejscach. W ten sposób parametry x i y będą dopasowywać int lub Integer i string, a na podstawie kontekstu doda dwie liczby całkowite (gdy parametry są int) lub połączy dwa ciągi (gdy parametry są ciągiem).
Zaimplementujmy program, który pokazuje wyrażenia lambda.
interface MyInterface { void abstract_func(int x,int y); default void default_Fun() { System.out.println('This is default method'); } } class Main { public static void main(String args[]) { //lambda expression MyInterface fobj = (int x, int y)->System.out.println(x+y); System.out.print('The result = '); fobj.abstract_func(5,5); fobj.default_Fun(); } }
Wynik:
Powyższy program pokazuje użycie wyrażenia Lambda do dodawania parametrów i wyświetla ich sumę. Następnie używamy tego do implementacji metody abstrakcyjnej „abstract_fun”, którą zadeklarowaliśmy w definicji interfejsu. Wynikiem wywołania funkcji „abstract_fun” jest suma dwóch liczb całkowitych przekazanych jako parametry podczas wywoływania funkcji.
Dowiemy się więcej o wyrażeniach lambda w dalszej części samouczka.
forEach () w interfejsie iterowalnym
Java 8 wprowadziła metodę „forEach” w interfejsie java.lang.Iterable, która może iterować po elementach kolekcji. „ForEach” jest metodą domyślną zdefiniowaną w interfejsie Iterowalnym. Jest używany przez klasy Collection, które rozszerzają interfejs iterowalny w celu iteracji elementów.
Metoda „forEach” przyjmuje interfejs funkcjonalny jako pojedynczy parametr, tj. Można przekazać wyrażenie Lambda jako argument.
Przykład metody forEach ().
importjava.util.ArrayList; importjava.util.List; public class Main { public static void main(String[] args) { List subList = new ArrayList(); subList.add('Maths'); subList.add('English'); subList.add('French'); subList.add('Sanskrit'); subList.add('Abacus'); System.out.println('------------Subject List--------------'); subList.forEach(sub -> System.out.println(sub)); } }
Wynik:
Mamy więc zbiór tematów, tj. SubList. Zawartość subList wyświetlamy za pomocą metody forEach, która pobiera wyrażenie Lambda do wydrukowania każdego elementu.
Klasa opcjonalna
Java 8 wprowadziła opcjonalną klasę w pakiecie „java.util”. „Opcjonalna” jest publiczną klasą końcową i jest używana do obsługi wyjątków NullPointerException w aplikacji Java. Za pomocą opcji Opcjonalne można określić alternatywny kod lub wartości do uruchomienia. Używając Optional, nie musisz używać zbyt wielu sprawdzeń null, aby uniknąć nullPointerException.
Możesz użyć klasy Optional, aby uniknąć nieprawidłowego zakończenia programu i zapobiec awarii programu. Klasa Optional udostępnia metody używane do sprawdzania obecności wartości dla określonej zmiennej.
Poniższy program demonstruje użycie klasy Optional.
import java.util.Optional; public class Main{ public static void main(String[] args) { String[] str = new String[10]; OptionalcheckNull = Optional.ofNullable(str[5]); if (checkNull.isPresent()) { String word = str[5].toLowerCase(); System.out.print(str); } else System.out.println('string is null'); } }
Wynik:
W tym programie używamy właściwości „ofNullable” klasy Optional, aby sprawdzić, czy ciąg ma wartość null. Jeśli tak, odpowiedni komunikat jest drukowany do użytkownika.
Metody domyślne i statyczne w interfejsach
W Javie 8 możesz dodać metody w interfejsie, które nie są abstrakcyjne, tj. Możesz mieć interfejsy z implementacją metody. Możesz użyć słowa kluczowego Default i Static, aby utworzyć interfejsy z implementacją metody. Domyślne metody głównie włączają funkcjonalność Lambda Expression.
Używając metod domyślnych, możesz dodać nowe funkcje do interfejsów w swoich bibliotekach. Dzięki temu kod napisany dla starszych wersji będzie zgodny z tymi interfejsami (zgodność binarna).
Rozumiemy metodę domyślną na przykładzie:
import java.util.Optional; interface interface_default { default void default_method(){ System.out.println('I am default method of interface'); } } class derived_class implements interface_default{ } class Main{ public static void main(String[] args){ derived_class obj1 = new derived_class(); obj1.default_method(); } }
Wynik:
Mamy interfejs o nazwie „interface_default” z metodą default_method () z domyślną implementacją. Następnie definiujemy klasę „Derived_class”, która implementuje interfejs „interface_default”.
Zauważ, że w tej klasie nie zaimplementowaliśmy żadnych metod interfejsu. Następnie w funkcji głównej tworzymy obiekt klasy „Deriv_class” i bezpośrednio wywołujemy „default_method” interfejsu bez konieczności definiowania jej w klasie.
To jest użycie domyślnych i statycznych metod w interfejsie. Jeśli jednak klasa chce dostosować metodę domyślną, można zapewnić jej własną implementację, zastępując metodę.
Odniesienia do metod
Funkcja odwołania do metod wprowadzona w Javie 8 jest skrótową notacją dla wyrażeń Lambda do wywołania metody interfejsu funkcjonalnego. Więc za każdym razem, gdy używasz wyrażenia lambda do odwołania się do metody, możesz zastąpić wyrażenie lambda odwołaniem do metody.
Przykład odniesienia do metody.
import java.util.Optional; interface interface_default { void display(); } class derived_class{ public void classMethod(){ System.out.println('Derived class Method'); } } class Main{ public static void main(String[] args){ derived_class obj1 = new derived_class(); interface_default ref = obj1::classMethod; ref.display(); } }
Wynik:
W tym programie mamy interfejs „interface_default” z abstrakcyjną metodą „display ()”. Następnie istnieje klasa „Deriv_class”, która ma publiczną metodę „classMethod”, która wyświetla komunikat.
W funkcji głównej mamy obiekt klasy, a następnie mamy odniesienie do interfejsu, który odwołuje się do metody klasy „classMethod” poprzez obj1 (obiekt klasy). Teraz, gdy metoda wyświetlania metody abstrakcyjnej jest wywoływana przez odwołanie do interfejsu, wyświetlana jest zawartość classMethod.
Java Stream API do zbiorczych operacji na danych na kolekcjach
Stream API to kolejna ważna zmiana wprowadzona w Javie 8. Stream API służy do przetwarzania kolekcji obiektów i obsługuje inny typ iteracji. Stream to sekwencja obiektów (elementów), która umożliwia potokowanie różnych metod w celu uzyskania żądanych wyników.
Strumień nie jest strukturą danych i otrzymuje dane wejściowe z kolekcji, tablic lub innych kanałów. Możemy potokować różne operacje pośrednie za pomocą strumieni, a operacje terminalowe zwracają wynik. Szczegółowo omówimy strumieniowe API w osobnym samouczku Java.
Java Date Time API
Java 8 wprowadza nowy interfejs API daty i czasu w pakiecie java.time.
Wśród nich najważniejsze klasy to:
- Lokalny: Uproszczony interfejs API daty i czasu bez złożoności obsługi stref czasowych.
- Strefowy: Specjalistyczny interfejs API daty i czasu do obsługi różnych stref czasowych.
Daktyle
Klasa Date stała się przestarzała w Javie 8.
Poniżej przedstawiono nowe klasy:
- Klasa LocalDate określa datę. Nie ma reprezentacji czasu ani strefy czasowej.
- LocalTime klasa określa czas. Nie ma reprezentacji daty ani strefy czasowej.
- Klasa LocalDateTime definiuje datę i godzinę. Nie ma reprezentacji strefy czasowej.
Aby uwzględnić informacje o strefie czasowej z funkcją daty, możesz użyć Lambda, która zapewnia 3 klasy, tj. OffsetDate, OffsetTime i OffsetDateTime. Tutaj przesunięcie strefy czasowej jest reprezentowane za pomocą innej klasy - „ZoneId”. Omówimy ten temat szczegółowo w dalszych częściach tej serii Java.
jak zgłosić błąd
Silnik JavaScript Rhinoceros
Java 8 wprowadziła znacznie ulepszony silnik JavaScript, czyli Nashorn, który zastępuje istniejący Rhino. Nashorn bezpośrednio kompiluje kod w pamięci, a następnie przekazuje kod bajtowy do maszyny JVM, zwiększając w ten sposób wydajność dziesięciokrotnie.
Nashorn wprowadza nowe narzędzie wiersza poleceń - jjs, które wykonuje kod JavaScript na konsoli.
Utwórzmy plik JavaScript „sample.js” zawierający poniższy kod.
print (‘Hello, World!!’);
Wydaj następującą komendę w konsoli:
C: Java jjs sample.js
Wynik: Witaj świecie!!
Możemy również uruchamiać programy JavaScript w trybie interaktywnym, a także dostarczać argumenty do programów.
Dekodowanie kodowania Base64
W Javie 8 jest wbudowane kodowanie i dekodowanie dla kodowania Base64. Klasa kodowania Base64 to java.util.Base64.
Ta klasa udostępnia trzy kodery i dekodery Base64:
- Podstawowy: W tym przypadku wynik jest odwzorowywany na zestaw znaków między A-Za-z0-9 + /. Żaden nowy wiersz nie jest dodawany do wyjścia przez koder, a dekoder odrzuca każdy inny znak niż powyższy.
- URL: Tutaj dane wyjściowe to adres URL, a bezpieczna nazwa pliku jest odwzorowana na zestaw znaków między A-Za-z0-9 + /.
- MIM: W tym typie kodera dane wyjściowe są mapowane na format przyjazny dla MIME.
Ulepszenia interfejsu API kolekcji
Java 8 dodała następujące nowe metody do Collection API:
- forEachRemaining (działanie konsumenckie): jest to metoda domyślna i jest przeznaczona dla iteratora. Wykonuje „akcję” dla każdego z pozostałych elementów, aż wszystkie elementy zostaną przetworzone lub „akcja” zgłosi wyjątek.
- Domyślna metoda kolekcji removeIf (filtr predykatu): usuwa wszystkie elementy w kolekcji, które spełniają dany „filtr”.
- Spliterator (): jest to metoda zbierania i zwraca instancję spliteratora, której można używać do przechodzenia przez elementy w sposób sekwencyjny lub równoległy.
- Kolekcja map ma metody replaceAll (), compute () i merge ().
- Klasa HashMap z Kolizjami kluczy została ulepszona w celu zwiększenia wydajności.
Zmiany / ulepszenia interfejsu API współbieżności
Poniżej przedstawiono ważne ulepszenia w Concurrent API:
- ConcurrentHashMap jest rozszerzany za pomocą następujących metod:
- compute (),
- dla każdego (),
- forEachEntry (),
- forEachKey (),
- forEachValue (),
- iść (),
- redukuj () i
- Szukaj ()
- Metoda „newWorkStealingPool ()” dla programów wykonawczych tworzy pulę wątków kradnącą pracę. Używa dostępnych procesorów jako docelowego poziomu równoległości.
- Metoda „completeableFuture” to metoda, którą możemy wykonać jawnie (ustawiając jej wartość i status).
Ulepszenia Java IO
Ulepszenia we / wy wykonane w Javie 8 obejmują:
- Files.list (katalog ścieżki): Zwraca to przepełniony strumień, którego każdy element jest wpisem w katalogu.
- Files.lines (ścieżka): Odczytuje wszystkie wiersze ze strumienia.
- Files.find (): Szukaj plików w drzewie plików zakorzenionych w podanym pliku początkowym i zwraca strumień wypełniony ścieżką.
- BufferedReader.lines (): Zwraca strumień z każdym jego elementem jako wiersze odczytane z BufferedReader.
Różne ulepszenia podstawowego interfejsu API
Mamy następujące różne ulepszenia API:
- Metoda statyczna withInitial (dostawca dostawcy) ThreadLocal, aby łatwo utworzyć instancję.
- Interfejs „Komparator” jest rozszerzony o domyślne i statyczne metody naturalnej kolejności odwrotnej kolejności itp.
- Klasy opakowania typu Integer, Long i Double mają metody min (), max () i sum ().
- Klasa Boolean została wzbogacona o metody logicalAnd (), logicalOr () i logicalXor ().
- W klasie Math wprowadzono kilka metod narzędziowych.
- Most JDBC-ODBC został usunięty.
- Przestrzeń pamięci PermGen jest usuwana.
Wniosek
W tym samouczku omówiliśmy główne funkcje dodane do wydania Java 8. Ponieważ Java 8 jest głównym wydaniem języka Java, ważne jest, aby znać wszystkie funkcje i udoskonalenia wprowadzone w ramach tego wydania.
Mimo że najnowsza wersja Java to 13, nadal dobrze jest zapoznać się z funkcjami Java 8. Wszystkie funkcje omówione w tym samouczku są nadal obecne w najnowszej wersji Java i omówimy je jako poszczególne tematy w dalszej części tej serii.
Mamy nadzieję, że ten samouczek pomógł Ci poznać różne funkcje Java 8 !!
rekomendowane lektury
- Samouczek dotyczący długości tablicy w języku Java z przykładami kodu
- Słowo kluczowe „this” w języku Java: samouczek z przykładami kodu
- Interfejs Java i samouczek klasy abstrakcyjnej z przykładami
- Samouczek JAVA dla początkujących: ponad 100 praktycznych samouczków wideo Java
- Wdrażanie Java: tworzenie i wykonywanie pliku Java JAR
- C ++ Vs Java: 30 najważniejszych różnic między C ++ a Javą z przykładami
- Metoda MongoDB Sort () z przykładami
- Poznaj podstawy języka Java w selenie z przykładami