prominent java 8 features with code examples
Изчерпателен списък и обяснение на всички най-важни функции, представени в Java 8 Release с примери:
Пускането на Java 8 от Oracle беше революционно издание на платформата за развитие №1 в света. Той включваше огромен ъпгрейд на програмния модел на Java като цяло, заедно с развитието на JVM, езика Java и библиотеките по координиран начин.
Тази версия включва няколко функции за Лесна употреба, Производителност, Подобрено програмиране на Polyglot, Сигурност и Като цяло подобрена производителност.
Какво ще научите:
- Функции, добавени към Java 8 версия
- Функционални интерфейси и ламбда изрази
- forEach () Метод в Итерируем интерфейс
- Незадължителен клас
- Стандартни и статични методи в интерфейсите
- Референции на методите
- API на Java Stream за групови операции с данни върху колекции
- API за дата и час на Java
- JavaScript двигател на Rhinoceros
- Декодиране на Base64 кодиране
- Подобрения на API за събиране
- Промени / подобрения на приложния програмен интерфейс (API)
- Подобрения в IO на Java
- Разни основни подобрения на API
- Заключение
Функции, добавени към Java 8 версия
Сред основните промени по-долу са забележителните функции, добавени към тази версия.
- Функционални интерфейси и Lambda Expressions
- forEach () метод в Iterable интерфейс
- Незадължителен клас,
- стандартни и статични методи в Интерфейси
- Препратки към методите
- API на Java Stream за групови операции с данни върху колекции
- API за дата и час на Java
- Подобрения на API на колекцията
- Подобрения на приложния програмен интерфейс на API
- Подобрения в IO на Java
- JavaScript двигател на Rhinoceros
- Декодиране на Base64 кодиране
- Разни подобрения на основния API
В този урок ще обсъдим накратко всяка от тези функции и ще се опитаме да обясним всяка от тях с помощта на прости и лесни примери.
Функционални интерфейси и ламбда изрази
Java 8 въвежда анотация, известна като @FunctionalInterface, която обикновено е за грешки на ниво компилатор. Обикновено се използва, когато интерфейсът, който използвате, нарушава договорите за функционален интерфейс.
Като алтернатива можете да извикате функционален интерфейс като интерфейс SAM или интерфейс Single Single Method. Функционалният интерфейс позволява точно един „абстрактен метод“ като свой член.
По-долу е даден пример за функционален интерфейс:
@FunctionalInterface public interface MyFirstFunctionalInterface { public void firstWork(); }
Можете да пропуснете анотацията, @FunctionalInterface и вашият функционален интерфейс ще остане валиден. Използваме тази анотация само за да информираме компилатора, че интерфейсът ще има един абстрактен метод.
Забележка: По дефиниция методите по подразбиране не са абстрактни и можете да добавите толкова методи по подразбиране във функционалния интерфейс, колкото искате.
На второ място, ако интерфейсът има абстрактен метод, който заменя един от публичните методи на „java.lang.object“, тогава той не се счита за абстрактния метод на интерфейса.
Дадено по-долу е валиден пример за функционален интерфейс.
@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 }
Ламбда израз (или функция) може да бъде дефиниран като анонимна функция (функция без име и идентификатор). Ламбда изразите се дефинират точно на мястото, където са необходими, обикновено като параметър за някаква друга функция.
От различна гледна точка, Lambda Expressions изразяват случаи на Функционални интерфейси (описано по-горе). Lambda Expressions изпълняват единствената абстрактна функция, присъстваща във функционалния интерфейс и по този начин реализират функционални интерфейси.
Основният синтаксис на Lambda Expression е:
Основен пример за Lambda Expression е:
Горният израз взема два параметъра x и y и връща сумата си x + y. Въз основа на типа данни x и y, методът може да се използва многократно на различни места. По този начин параметрите x и y ще съвпадат с int или Integer и низ и въз основа на контекста ще добавят две цели числа (когато параметрите са int) или конкатират двата низа (когато параметрите са низ).
Нека да приложим програма, която демонстрира ламбда изрази.
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(); } }
Изход:
Горната програма показва използването на Lambda Expression за добавяне към параметри и показва тяхната сума. След това използваме това, за да реализираме абстрактния метод “abstract_fun”, който декларирахме в дефиницията на интерфейса. Резултатът от извикването на функцията „abstract_fun“ е сумата от двете цели числа, предадени като параметри при извикване на функцията.
Ще научим повече за Lambda Expressions по-късно в урока.
forEach () Метод в Итерируем интерфейс
Java 8 е въвела метод “forEach” в интерфейса java.lang.Iterable, който може да итерира върху елементите в колекцията. “ForEach” е метод по подразбиране, дефиниран в интерфейса Iterable. Използва се от класовете Collection, които разширяват интерфейса Iterable за итерация на елементи.
Методът 'forEach' приема функционалния интерфейс като единичен параметър, т.е. можете да предадете Lambda Expression като аргумент.
Пример за метода 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)); } }
Изход:
Така че ние имаме колекция от теми, т.е. subList. Показваме съдържанието на подлистата, използвайки метода forEach, който отнема Lambda Expression за отпечатване на всеки елемент.
Незадължителен клас
Java 8 представи незадължителен клас в пакета “java.util”. “Незадължително” е публичен финален клас и се използва за справяне с NullPointerException в Java приложението. Използвайки Незадължително, можете да посочите алтернативен код или стойности, които да се изпълняват. Като използвате Незадължително, не е нужно да използвате твърде много нулеви проверки, за да избегнете nullPointerException.
Можете да използвате класа по избор, за да избегнете необичайно прекратяване на програмата и да предотвратите срив на програмата. Класът по избор предоставя методи, които се използват за проверка на наличието на стойност за определена променлива.
Следващата програма демонстрира използването на незадължителния клас.
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'); } }
Изход:
В тази програма използваме свойството “ofNullable” на класа по избор, за да проверим дали низът е нулев. Ако е, съответното съобщение се отпечатва на потребителя.
Стандартни и статични методи в интерфейсите
В Java 8 можете да добавяте методи в интерфейса, които не са абстрактни, т.е.можете да имате интерфейси с изпълнение на метода. Можете да използвате ключовата дума Default и Static за създаване на интерфейси с внедряване на метод. Методите по подразбиране позволяват предимно функционалността на Lambda Expression.
Използвайки методи по подразбиране, можете да добавите нова функционалност към вашите интерфейси във вашите библиотеки. Това ще гарантира, че кодът, написан за по-старите версии, е съвместим с тези интерфейси (двоична съвместимост).
Нека разберем метода по подразбиране с пример:
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(); } }
Изход:
Имаме интерфейс, наречен „interface_default“ с метода default_method () с изпълнение по подразбиране. След това дефинираме клас “deriva_class”, който реализира интерфейса “interface_default”.
Имайте предвид, че не сме внедрили никакви методи за интерфейс в този клас. След това в основната функция ние създаваме обект от клас “deriva_class” и директно извикваме “default_method” на интерфейса, без да се налага да го дефинираме в класа.
Това е използването на стандартни и статични методи в интерфейса. Ако обаче клас иска да персонализира метода по подразбиране, можете да предоставите собствена реализация, като замените метода.
Референции на методите
Функцията за справка на метода, въведена в Java 8, е съкратено означение за Lambda Expressions, за да извика метод на функционален интерфейс. Така че всеки път, когато използвате Lambda Expression за препращане към метод, можете да замените вашия Lambda Expression с референтен метод.
Пример за справка за метод.
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(); } }
Изход:
В тази програма имаме интерфейс “interface_default” с абстрактен метод “display ()”. След това има клас “deriva_class”, който има публичен метод “classMethod”, който отпечатва съобщение.
В основната функция имаме обект за класа и след това имаме препратка към интерфейса, който се позовава на метод на клас “classMethod” чрез obj1 (обект на клас). Сега, когато дисплеят на абстрактния метод се извиква чрез препратка към интерфейса, тогава се показва съдържанието на classMethod.
API на Java Stream за групови операции с данни върху колекции
API на потока е още една голяма промяна, въведена в Java 8. Stream API се използва за обработка на колекцията от обекти и поддържа различен тип итерация. Потокът е последователност от обекти (елементи), която ви позволява да комбинирате различни методи за получаване на желаните резултати.
Потокът не е структура от данни и той получава своите данни от колекции, масиви или други канали. Можем да конвейираме различни междинни операции, използвайки Streams и терминалните операции връщат резултата. Ще обсъдим поток API по-подробно в отделен урок за Java.
API за дата и час на Java
Java 8 представя нов API за дата и час под пакета java.time.
Най-важните класове сред тях са:
- Местен: Опростен API за дата и час, без сложност на обработката на часовата зона.
- Зонирано: Специализиран API за дата и час за справяне с различни часови зони.
Дати
Класът дата е остарял в Java 8.
По-долу са представени новите класове:
- Класът LocalDate определя дата. Той няма представяне за време или часови пояс.
- LocalTime клас определя време. Той няма представяне за дата или часова зона.
- Класът LocalDateTime определя дата-час. Той няма представяне на часова зона.
За да включите информация за часовата зона с функционалност за дата, можете да използвате Lambda, която осигурява 3 класа, т.е. OffsetDate, OffsetTime и OffsetDateTime. Тук отместването на часовата зона е представено с помощта на друг клас - “ZoneId”. Ще разгледаме тази тема подробно в по-късните части на тази поредица Java.
JavaScript двигател на Rhinoceros
Java 8 представи много подобрен двигател за JavaScript, т.е. Nashorn, който замества съществуващия Rhino. Nashorn директно компилира кода в паметта и след това предава байт кода на JVM, като по този начин подобрява производителността с 10 пъти.
Nashorn представя нов инструмент за команден ред - jjs, който изпълнява JavaScript код на конзолата.
Нека създадем JavaScript файл ‘sample.js’, който съдържа следния код.
print (‘Hello, World!!’);
Дайте следната команда в конзолата:
C: Java jjs sample.js
Изход: Здравей свят!!
Също така можем да стартираме JavaScript програми в интерактивен режим и също така да предоставяме аргументи на програмите.
Декодиране на Base64 кодиране
В Java 8 има вградено кодиране и декодиране за Base64 кодиране. Класът за кодиране Base64 е java.util.Base64.
Този клас осигурява три кодиращи и декодиращи устройства Base64:
- Основен: При това изходът се преобразува в набор от символи между A-Za-z0-9 + /. Към изхода от енкодера не се добавя подаване на редове и декодерът отхвърля всеки символ, различен от горния.
- URL: Тук изходът е URL и безопасното име на файла се съпоставя към набора от символи между A-Za-z0-9 + /.
- MIME: При този тип кодер изходът се преобразува в MIME приятелски формат.
Подобрения на API за събиране
Java 8 е добавила следните нови методи към API за събиране:
- forEachRemaining (Потребителско действие): Това е метод по подразбиране и е за Iterator. Той изпълнява „действието“ за всеки от останалите елементи, докато всички елементи бъдат обработени или „действието“ изведе изключение.
- Методът по подразбиране за колекция removeIf (филтър предикати): Това премахва всички елементи в колекцията, които удовлетворяват дадения „филтър“.
- Spliterator (): Това е метод за събиране и връща екземпляра на spliterator, който можете да използвате за обхождане на елементите по последователен или паралелен начин.
- Колекцията от карти има методи replaceAll (), compute () и merge ().
- Класът на HashMap с ключови сблъсъци е подобрен, за да подобри производителността.
Промени / подобрения на приложния програмен интерфейс (API)
Следват важните подобрения в Concurrent API:
- ConcurrentHashMap се подобрява със следните методи:
- изчисли (),
- за всеки (),
- forEachEntry (),
- forEachKey (),
- forEachValue (),
- отивам (),
- намаляване () и
- Търсене ()
- Методът “newWorkStealingPool ()” за изпълнителите създава пул от нишки за кражба на работа. Той използва наличните процесори като целево ниво на паралелизъм.
- Методът “completableFuture” е този, който можем да завършим изрично (чрез задаване на неговата стойност и състояние).
Подобрения в IO на Java
Подобренията в IO, направени в Java 8, включват:
- Files.list (директория на пътя): Това връща jlazily попълнен поток, чийто всеки елемент е записът в директорията.
- Files.lines (Път на пътя): Чете всички редове от поток.
- Files.find (): Търсете файлове в файловото дърво, вкоренени в даден стартов файл и връща поток, попълнен от път.
- BufferedReader.lines (): Връща поток с всеки негов елемент като редовете, прочетени от BufferedReader.
Разни основни подобрения на API
Разполагаме със следните различни подобрения на API:
java j2ee интервю въпроси и отговори за опитни
- Статичен метод withInitial (доставчик на доставчик) на ThreadLocal за лесно създаване на екземпляр.
- Интерфейсът „Comparator” е разширен със стандартни и статични методи за естествено подреждане на обратен ред и др.
- Класовете Integer, Long и Double wrapper имат методи min (), max () и sum ().
- Булевият клас се подобрява с методите logicAnd (), logicOr () и logicXor ().
- Няколко полезни метода са въведени в класа по математика.
- Мостът JDBC-ODBC е премахнат.
- Пространството в паметта на PermGen е премахнато.
Заключение
В този урок обсъдихме основните функции, които бяха добавени към изданието Java 8. Тъй като Java 8 е основна версия на Java, важно е да знаете всички функции и подобрения, направени като част от тази версия.
Въпреки че последната версия на Java е 13, все пак е добра идея да се запознаете с функциите на Java 8. Всички функции, обсъдени в този урок, все още присъстват в най-новата версия на Java и ще ги обсъдим като отделни теми по-късно в тази поредица.
Надяваме се, че този урок ви е помогнал да научите за различни функции на Java 8 !!
Препоръчително четене
- Урок за дължина на масив Java с примери за кодове
- Java 'this' Ключова дума: Урок с примери за кодове
- Урок за интерфейс на Java и абстрактен клас с примери
- Урок за JAVA за начинаещи: 100+ практически ръководства за Java видео
- Разполагане на Java: Създаване и изпълнение на Java JAR файл
- C ++ срещу Java: Топ 30 разлики между C ++ и Java с примери
- Метод за сортиране на MongoDB () с примери
- Разгледайте основите на Java в селен с примери