prominent java 8 features with code examples
Вичерпний перелік та пояснення всіх основних функцій, представлених у випуску Java 8, із прикладами:
Випуск Java 8 від Oracle став революційним випуском світової платформи розробки №1. Вона включала величезне оновлення моделі програмування Java в цілому, а також узгоджений розвиток JVM, мови Java та бібліотек.
Цей випуск включав декілька функцій для простоти використання, продуктивності, вдосконаленого програмування поліглотів, безпеки та загальної покращеної продуктивності.
Що ви дізнаєтесь:
як мені стати тестувальником продукції
- Особливості, додані до випуску Java 8
- Функціональні інтерфейси та лямбда-вирази
- Метод forEach () в ітерабельному інтерфейсі
- Необов’язковий клас
- Стандартні та статичні методи в інтерфейсах
- Посилання на методи
- API Java Stream для масових операцій з даними над колекціями
- API дати часу Java
- Двигун JavaScript носорога
- Розшифруйте кодування Base64
- Удосконалення API колекції
- Зміни / вдосконалення API паралельної взаємодії
- Удосконалення Java IO
- Різні базові вдосконалення API
- Висновок
Особливості, додані до випуску Java 8
Серед основних змін, нижче наведено помітні функції, які були додані до цього випуску.
- Функціональні інтерфейси та лямбда-вирази
- метод forEach () в інтерфейсі Iterable
- Факультативний клас,
- стандартні та статичні методи в інтерфейсах
- Посилання на методи
- API Java Stream для масових операцій з даними над колекціями
- API дати часу Java
- Поліпшення API колекції
- Покращення API паралельності
- Покращення Java IO
- Двигун JavaScript носорога
- Розшифруйте кодування Base64
- Різні вдосконалення основного API
У цьому посібнику ми коротко обговоримо кожну з цих функцій і спробуємо пояснити кожну з них за допомогою простих і простих прикладів.
Функціональні інтерфейси та лямбда-вирази
Java 8 представляє анотацію, відому як @FunctionalInterface, яка зазвичай призначена для помилок рівня компілятора. Зазвичай він використовується, коли інтерфейс, який ви використовуєте, порушує контракти функціонального інтерфейсу.
Крім того, ви можете викликати функціональний інтерфейс як інтерфейс SAM або інтерфейс Single Abstract 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 }
Лямбда-вираз (або функцію) можна визначити як анонімну функцію (функцію без імені та ідентифікатора). Лямбда-вирази визначаються саме там, де вони потрібні, як правило, як параметр для якоїсь іншої функції.
З іншої точки зору, лямбда-вирази виражають випадки Функціональні інтерфейси (описано вище). Лямбда-вирази реалізують єдину абстрактну функцію, присутню у функціональному інтерфейсі, і таким чином реалізують функціональні інтерфейси.
Основним синтаксисом виразу Лямбда є:
Основним прикладом виразу Лямбда є:
Наведений вище вираз приймає два параметри 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(); } }
Вихід:
У наведеній вище програмі показано використання лямбда-виразу для додавання до параметрів та відображається їх сума. Потім ми використовуємо це для реалізації абстрактного методу “abstract_fun”, який ми оголосили у визначенні інтерфейсу. Результатом виклику функції 'abstract_fun' є сума двох цілих чисел, переданих як параметри під час виклику функції.
Детальніше про лямбда-вирази ми дізнаємось далі у підручнику.
Метод forEach () в ітерабельному інтерфейсі
Java 8 представила метод “forEach” в інтерфейсі java.lang.Iterable, який може перебирати елементи в колекції. “ForEach” - метод за замовчуванням, визначений в інтерфейсі Iterable. Він використовується класами Collection, які розширюють інтерфейс Iterable для ітерації елементів.
Метод “forEach” приймає функціональний інтерфейс як єдиний параметр, тобто ви можете передавати вираз Лямбда як аргумент.
Приклад методу 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)); } }
Вихід:
Отже, ми маємо колекцію предметів, тобто підсписок. Ми відображаємо вміст підсписку за допомогою методу forEach, який приймає лямбда-вираз для друку кожного елемента.
Необов’язковий клас
Java 8 представила необов’язковий клас у пакеті “java.util”. “Необов’язково” є загальнодоступним фінальним класом і використовується для роботи з NullPointerException у програмі Java. Використовуючи необов’язково, ви можете вказати альтернативний код або значення для запуску. Використовуючи необов’язково, вам не потрібно використовувати забагато перевірок на нуль, щоб уникнути nullPointerException.
Ви можете використовувати необов’язковий клас, щоб уникнути ненормального завершення програми та запобігти аварійному завершенню роботи програми. Клас Optional надає методи, які використовуються для перевірки наявності значення для певної змінної.
Наступна програма демонструє використання класу 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'); } }
Вихід:
У цій програмі ми використовуємо властивість “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, є скороченим позначенням лямбда-виразів для виклику методу функціонального інтерфейсу. Отже, кожного разу, коли ви використовуєте лямбда-вираз для посилання на метод, ви можете замінити свій лямбда-вираз на посилання на метод.
Приклад посилання на метод.
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 Stream - це ще одна суттєва зміна, введена в Java 8. Stream API використовується для обробки колекції об’єктів і підтримує інший тип ітерацій. Потік - це послідовність об’єктів (елементів), яка дозволяє конвеєрувати різні методи для отримання бажаних результатів.
Потік не є структурою даних, і він отримує свої вхідні дані з колекцій, масивів чи інших каналів. Ми можемо конвеєрувати різні проміжні операції, використовуючи Streams, і термінальні операції повертають результат. Ми докладніше обговоримо API потоку в окремому навчальному посібнику Java.
API дати часу Java
Java 8 представляє новий API дати та часу під пакетом java.time.
Найважливіші класи серед них:
- Місцеві: Спрощений API дати та часу без складності в обробці часового поясу.
- Зонований: Спеціалізований API часу та часу для роботи з різними часовими поясами.
Дати
Клас дати застарів у Java 8.
Нижче представлені нові класи:
- Клас LocalDate визначає дату. Він не представляє часу або часового поясу.
- Місцевий час клас визначає час. У ньому не вказано дату чи часовий пояс.
- Клас LocalDateTime визначає дату-час. Він не представляє часовий пояс.
Щоб включити інформацію про часовий пояс із функціоналом дати, ви можете використовувати лямбду, яка забезпечує 3 класи, тобто OffsetDate, OffsetTime та OffsetDateTime. Тут зміщення часового поясу представлено за допомогою іншого класу - “ZoneId”. Ми детально розглянемо цю тему в наступних частинах цієї серії Java.
Двигун JavaScript носорога
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 (дія споживача): Це метод за замовчуванням, призначений для Ітератора. Він виконує 'дію' для кожного з решти елементів, доки всі елементи не обробляються, або 'дія' видає виняток.
- Метод за замовчуванням для колекції removeIf (фільтр предикатів): Це видаляє всі елементи колекції, які задовольняють заданому “фільтру”.
- Сплітератор (): Це метод збору і повертає екземпляр сплітератора, який ви можете використовувати для обходу елементів послідовно або паралельно.
- У колекції карт є методи replaceAll (), compute () та merge ().
- Клас HashMap із зіткненнями ключів покращений для підвищення продуктивності.
Зміни / вдосконалення API паралельної взаємодії
Нижче наведено важливі вдосконалення одночасного API:
де знаходиться ключ безпеки мережі, розташований на моєму маршрутизаторі
- ConcurrentHashMap покращується такими методами:
- обчислити (),
- для кожного (),
- forEachEntry (),
- forEachKey (),
- forEachValue (),
- go (),
- зменшити () та
- пошук ()
- Метод “newWorkStealingPool ()” для виконавців створює пул потоків для викрадення роботи. Він використовує доступні процесори як свій цільовий рівень паралельності.
- Метод “completableFuture” - це той, який ми можемо виконати явно (встановивши його значення та статус).
Удосконалення Java IO
Удосконалення IO, зроблені в Java 8, включають:
- Files.list (реж. Шляху): Це повертає jlazily заповнений потік, кожен елемент якого є записом у каталозі.
- Files.lines (Шлях шляху): Зчитує всі рядки з потоку.
- Files.find (): Шукати файли в дереві файлів, коріння яких було задано в початковому файлі, і повертає потік, заповнений шляхом.
- BufferedReader.lines (): Повертає потік з кожним його елементом, коли рядки читаються з BufferedReader.
Різні базові вдосконалення API
Ми маємо наступні вдосконалення API:
- Статичний метод withInitial (постачальник постачальника) ThreadLocal для простого створення екземпляра.
- Інтерфейс “Comparator” розширений стандартними та статичними методами для природного впорядкування зворотного порядку тощо.
- Цілі, довгі та подвійні класи обгортки мають методи min (), max () та sum ().
- Логічний клас покращений за допомогою методів logicAnd (), logicOr () та logicXor ().
- У класі Math представлено кілька корисних методів.
- Міст 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 в селені на прикладах