Java 8 — Краткое руководство
Java 8 — Обзор
JAVA 8 — это основная версия разработки языка программирования JAVA. Его первоначальная версия была выпущена 18 марта 2014 года. В выпуске Java 8 в Java появилась поддержка функционального программирования, новый движок JavaScript, новые API-интерфейсы для манипулирования датой и временем, новый API потоковой передачи и т. д.
Новые функции
-
Лямбда-выражение − Добавляет возможности функциональной обработки в Java.
-
Ссылки на методы − Ссылки на функции по их именам вместо прямого вызова. Использование функций в качестве параметра.
-
Метод по умолчанию − Интерфейс для реализации метода по умолчанию.
-
Новые инструменты − Добавлены новые инструменты и утилиты компилятора, такие как jdeps, для определения зависимостей.
-
API потоковой передачи − Новый потоковый API для облегчения конвейерной обработки.
-
API даты и времени − Улучшен API даты и времени.
-
Необязательно − Упор на передовой опыт правильной обработки нулевых значений.
-
Nashorn, движок JavaScript − Механизм на основе Java для выполнения кода JavaScript.
Рассмотрим следующий фрагмент кода.
Живая демонстрация09
Запустите программу, чтобы получить следующий результат.
18
Здесь sortUsingJava8() метод использует функцию сортировки с лямбда-выражением в качестве параметра для получения критериев сортировки.
Java 8 — Настройка среды
Настройка локальной среды
Если вы хотите настроить свою собственную среду для языка программирования Java, этот раздел проведет вас через весь процесс. Пожалуйста, следуйте инструкциям ниже, чтобы настроить среду Java.
Java SE можно скачать бесплатно по следующей ссылке —
https://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html
Вы загружаете версию для своей операционной системы.
Следуйте инструкциям по загрузке Java и запустите файл .exe. установить Java на свой компьютер. После того, как вы установили Java на свой компьютер, вам нужно будет установить переменные среды, чтобы они указывали на правильные каталоги установки.
Настройка пути для Windows 2000/XP
Предполагая, что вы установили Java в каталог c:\Program Files\java\jdk —
-
Щелкните правой кнопкой мыши "Мой компьютер" и выберите "Свойства".
-
Нажмите кнопку "Переменные среды" на вкладке "Дополнительно".
-
Теперь измените переменную Path, чтобы она также содержала путь к исполняемому файлу Java. Например, если в настоящее время задан путь «C:\WINDOWS\SYSTEM32», измените его на «C:\WINDOWS\SYSTEM32;c:\Program Files\java\jdk\bin».
Настройка пути для Windows 95/98/ME
Предполагая, что вы установили Java в каталог c:\Program Files\java\jdk —
-
Отредактируйте файл «C:\autoexec.bat» и добавьте в конец следующую строку —
УСТАНОВИТЬ ПУТЬ=%PATH%;C:\Program Files\java\jdk\bin
Настройка пути для Linux, UNIX, Solaris, FreeBSD
Переменная среды PATH должна указывать на место установки двоичных файлов Java. Обратитесь к документации по вашей оболочке, если у вас возникли проблемы с этим.
Например, если вы используете bash в качестве оболочки, вы должны добавить следующую строку в конец файла '.bashrc:export PATH=/path/to/java:$PATH'
Популярные редакторы Java
Чтобы писать программы на Java, вам нужен текстовый редактор. На рынке доступны еще более сложные IDE. Но пока вы можете рассмотреть один из следующих вариантов —
-
Блокнот − На компьютере с Windows вы можете использовать любой простой текстовый редактор, например Блокнот (рекомендуется для этого руководства) или TextPad.
-
Нетбинс − Это Java IDE с открытым исходным кодом и бесплатно. Его можно загрузить с https://netbeans.org/index.html.
-
Затмение − Это также Java IDE, разработанная сообществом открытого исходного кода Eclipse, и ее можно загрузить с https://www.eclipse.org/.
Java 8 – лямбда-выражения
Лямбда-выражения появились в Java 8 и считаются самой важной функцией Java 8. Лямбда-выражения облегчают функциональное программирование и значительно упрощают разработку.
Синтаксис
Лямбда-выражение характеризуется следующим синтаксисом.
26
Ниже приведены важные характеристики лямбда-выражения.
-
Необязательное объявление типа − Нет необходимости объявлять тип параметра. Компилятор может вывести то же самое из значения параметра.
-
Необязательные скобки вокруг параметра − Нет необходимости объявлять один параметр в скобках. Для нескольких параметров необходимы круглые скобки.
-
Необязательные фигурные скобки − Нет необходимости использовать фигурные скобки в теле выражения, если оно содержит один оператор.
-
Необязательное возвращаемое ключевое слово − Компилятор автоматически возвращает значение, если в теле есть одно выражение для возврата значения. Фигурные скобки необходимы, чтобы указать, что выражение возвращает значение.
Пример лямбда-выражений
Создайте следующую программу Java, используя любой редактор по вашему выбору, например, C:\> JAVA.
Java8Tester.java
Живая демонстрация30
Проверьте результат
Скомпилируйте класс, используя javac компилятор следующим образом —
48
Теперь запустите Java8Tester следующим образом —
56
Он должен произвести следующий вывод —
69
Ниже приведены важные моменты, которые следует учитывать в приведенном выше примере.
-
Лямбда-выражения используются в основном для определения встроенной реализации функционального интерфейса, то есть интерфейса только с одним методом. В приведенном выше примере мы использовали различные типы лямбда-выражений для определения метода работы интерфейса MathOperation. Затем мы определили реализацию sayMessage службы GreetingService.
-
Лямбда-выражение устраняет необходимость в анонимном классе и предоставляет Java очень простые, но мощные возможности функционального программирования.
Область
Используя лямбда-выражение, вы можете ссылаться на любую конечную переменную или фактически конечную переменную (которая назначается только один раз). Лямбда-выражение выдает ошибку компиляции, если переменной присваивается значение во второй раз.
Пример области действия
Создайте следующую программу Java, используя любой редактор по вашему выбору, например, C:\> JAVA.
Java8Tester.java
Живая демонстрация71
Проверьте результат
Скомпилируйте класс, используя javac компилятор следующим образом —
87
Теперь запустите Java8Tester следующим образом —
97
Он должен произвести следующий вывод —
105пре>Java 8 – Ссылки на методы
Ссылки на методы помогают указать на методы по их именам. Ссылка на метод описывается с помощью символа "::". Ссылку на метод можно использовать для указания следующих типов методов —
- Статические методы
- Методы экземпляра
- Конструкторы, использующие новый оператор (TreeSet::new)
Пример ссылки на метод
Создайте следующую программу Java, используя любой редактор по вашему выбору, например, C:\> JAVA.
Java8Tester.java
112
Здесь мы передали метод System.out::println в качестве ссылки на статический метод.
Проверьте результат
Скомпилируйте класс, используя javac компилятор следующим образом —
127
Теперь запустите Java8Tester следующим образом —
132
Он должен произвести следующий вывод —
144
Java 8 — функциональные интерфейсы
Функциональные интерфейсы имеют одну функциональность для демонстрации. Например, интерфейс Comparable с одним методом «compareTo» используется для целей сравнения. В Java 8 определено множество функциональных интерфейсов, которые можно широко использовать в лямбда-выражениях. Ниже приведен список функциональных интерфейсов, определенных в пакете java.util.Function.
Сер.№ | Интерфейс и описание |
---|---|
1 | <тд>|
2 | <тд>|
3 | <тд>|
4 | <тд>|
5 | <тд>|
6 | <тд>|
7 | <тд>|
8 | <тд>|
9 | <тд>|
10 | <тд>|
11 | <тд>|
12 | <тд>|
13 | <тд>|
14 | <тд>|
15 | <тд>|
16 | <тд>|
17 | <тд>|
18 | <тд>|
19 | <тд>|
20 | <тд>|
21 | <тд>|
22 | <тд>|
23 | <тд>|
24 | <тд>|
25 | <тд>|
26 | <тд>|
27 | <тд>|
28 | <тд>|
29 | <тд>|
30 | <тд>|
31 | <тд>|
32 | <тд>|
33 | <тд>|
34 | <тд>|
35 | <тд>|
36 | <тд>|
37 | <тд>|
38 | <тд>|
39 | <тд>|
40 | <тд>|
41 | <тд>|
42 | <тд>|
43 | <тд>
Пример функционального интерфейса
Интерфейс Predicate
Создайте следующую программу Java, используя любой редактор по вашему выбору, например, C:\> JAVA.
Java8Tester.java
Живая демонстрация157
Здесь мы передали интерфейс Predicate, который принимает один вход и возвращает логическое значение.
Проверьте результат
Скомпилируйте класс, используя javac компилятор следующим образом —
163
Теперь запустите Java8Tester следующим образом —
177
Он должен произвести следующий вывод —
184
Java 8 — методы по умолчанию
В Java 8 представлена новая концепция реализации методов по умолчанию в интерфейсах. Эта возможность добавлена для обратной совместимости, чтобы можно было использовать старые интерфейсы для использования возможностей лямбда-выражений Java 8.
Например, интерфейсы «Список» или «Коллекция» не имеют объявления метода «forEach». Таким образом, добавление такого метода просто нарушит реализацию фреймворка коллекции. В Java 8 представлен метод по умолчанию, так что интерфейс List/Collection может иметь реализацию метода forEach по умолчанию, и класс, реализующий эти интерфейсы, не должен реализовывать то же самое.
Синтаксис
195
Несколько значений по умолчанию
С функциями по умолчанию в интерфейсах существует вероятность того, что класс реализует два интерфейса с одинаковыми методами по умолчанию. Следующий код объясняет, как можно разрешить эту двусмысленность.
200
Первое решение — создать собственный метод, который переопределяет реализацию по умолчанию.
217
Второе решение — вызвать метод по умолчанию указанного интерфейса с помощью super.
227
Статические методы по умолчанию
Интерфейс также может иметь статические вспомогательные методы начиная с Java 8.
236
Пример метода по умолчанию
Создайте следующую программу Java, используя любой редактор по вашему выбору, например, C:\> JAVA.
Java8Tester.java
Живая демонстрация249
Проверьте результат
Скомпилируйте класс, используя javac компилятор следующим образом —
259
Теперь запустите Java8Tester следующим образом —
263
Он должен произвести следующий вывод —
277
Java 8 — Потоки
Поток — это новый абстрактный слой, представленный в Java 8. Используя поток, вы можете обрабатывать данные декларативным способом, подобным операторам SQL. Например, рассмотрим следующую инструкцию SQL.
282
Приведенное выше выражение SQL автоматически возвращает сведения о максимальном наемном работнике без каких-либо вычислений со стороны разработчика. Используя фреймворк коллекций в Java, разработчику приходится использовать циклы и повторять проверки. Другой проблемой является эффективность; поскольку многоядерные процессоры легко доступны, разработчик Java должен писать параллельную обработку кода, которая может быть довольно подвержена ошибкам.
Чтобы решить такие проблемы, в Java 8 была представлена концепция потока, которая позволяет разработчику обрабатывать данные декларативно и использовать многоядерную архитектуру без необходимости писать для этого какой-либо специальный код.
Что такое поток?
Поток представляет собой последовательность объектов из источника, которая поддерживает агрегатные операции. Ниже приведены характеристики потока —
-
Последовательность элементов − Поток последовательно предоставляет набор элементов определенного типа. Поток получает/вычисляет элементы по требованию. Он никогда не сохраняет элементы.
-
Источник − Stream использует коллекции, массивы или ресурсы ввода-вывода в качестве источника ввода.
-
Агрегированные операции − Stream поддерживает агрегированные операции, такие как фильтрация, сопоставление, ограничение, сокращение, поиск, сопоставление и т. д.
-
Конвейерная обработка − Большинство операций с потоками возвращают сам поток, чтобы их результат можно было передать по конвейеру. Эти операции называются промежуточными операциями, и их функция состоит в том, чтобы принимать входные данные, обрабатывать их и возвращать результат в цель. Метод collect() — это терминальная операция, которая обычно присутствует в конце операции конвейерной обработки, чтобы отметить конец потока.
-
Автоматические итерации − Потоковые операции выполняют внутренние итерации по предоставленным исходным элементам, в отличие от коллекций, где требуется явная итерация.
Создание потоков
В Java 8 интерфейс Collection имеет два метода для создания потока.
-
поток() − Возвращает последовательный поток, считая коллекцию источником.
-
параллельный поток() − Возвращает параллельный поток, считая коллекцию источником.
293
для каждого
Stream предоставил новый метод forEach для повторения каждого элемента потока. В следующем фрагменте кода показано, как вывести 10 случайных чисел с помощью forEach.
302
карта
Метод map используется для сопоставления каждого элемента с соответствующим результатом. Следующий сегмент кода печатает уникальные квадраты чисел, используя карту.
315
фильтр
Метод «фильтр» используется для исключения элементов на основе критерия. Следующий сегмент кода выводит количество пустых строк с использованием фильтра.
325
лимит
Метод «ограничения» используется для уменьшения размера потока. В следующем фрагменте кода показано, как вывести 10 случайных чисел с помощью ограничения.
338
отсортировано
Метод sorted используется для сортировки потока. В следующем фрагменте кода показано, как напечатать 10 случайных чисел в отсортированном порядке.
342
Параллельная обработка
parallelStream — это альтернатива потоку для параллельной обработки. Взгляните на следующий фрагмент кода, который выводит количество пустых строк с помощью parallelStream.
353
Очень легко переключаться между последовательным и параллельным потоками.
Коллекционеры
Коллекторы используются для объединения результатов обработки элементов потока. Коллекторы можно использовать для возврата списка или строки.
364
Статистика
В Java 8 введены сборщики статистики для расчета всей статистики при выполнении потоковой обработки.
376
Пример трансляции
Создайте следующую программу Java, используя любой редактор по вашему выбору, например, C:\> JAVA.
Java8Tester.java
Живая демонстрация385
Проверьте результат
Скомпилируйте класс, используя javac компилятор следующим образом —
391
Теперь запустите Java8Tester следующим образом —
404
Это должно дать следующий результат —
418
Java 8 – необязательный класс
Необязательный объект-контейнер, используемый для хранения ненулевых объектов. Необязательный объект используется для представления null с отсутствующим значением. Этот класс имеет различные служебные методы, облегчающие коду обработку значений как «доступных» или «недоступных» вместо проверки нулевых значений. Он появился в Java 8 и похож на опциональный в Guava.
Объявление класса
Ниже приведено объявление для java.util.Optional
421
Метод класса
Сер.№ | Метод и описание |
---|---|
1 | <тд>|
2 | <тд>|
3 | <тд>|
4 | <тд>|
5 | <тд>|
6 | <тд>|
7 | <тд>|
8 | <тд>|
9 | <тд>|
10 | <тд>|
11 | <тд>|
12 | <тд>|
13 | <тд>|
14 | <тд>|
15 | <тд>
Этот класс наследует методы от следующего класса —
- java.lang.Объект
Необязательный пример
Создайте следующую программу Java, используя любой редактор по вашему выбору, например, C:\> JAVA.
Java8Tester.java
Живая демонстрация435
Проверьте результат
Скомпилируйте класс, используя javac компилятор следующим образом —
444
Теперь запустите Java8Tester следующим образом —
452
Он должен произвести следующий вывод —
468
Java 8 – Nashorn JavaScript
С Java 8, Nashorn, представлен значительно улучшенный движок javascript, который заменит существующий Rhino. Nashorn обеспечивает от 2 до 10 раз более высокую производительность, поскольку он напрямую компилирует код в памяти и передает байт-код в JVM. Nashorn использует функцию динамического вызова, представленную в Java 7, для повышения производительности.
JJS
Для механизма Nashorn в JAVA 8 представлен новый инструмент командной строки, jjs, для выполнения кода javascript в консоли.
Интерпретация файла js
Создайте и сохраните файл sample.js. в папке c:\>JAVA.
sample.js
470
Откройте консоль и используйте следующую команду.
480
Он выдаст следующий вывод:
490
jjs в интерактивном режиме
Откройте консоль и используйте следующую команду.
501
Передать аргументы
Откройте консоль и используйте следующую команду.
518
Вызов JavaScript из Java
С помощью ScriptEngineManager код JavaScript можно вызывать и интерпретировать в Java.
Пример
Создайте следующую программу Java, используя любой редактор по вашему выбору, например, C:\> JAVA.
Java8Tester.java
Живая демонстрация526
Проверьте результат
Скомпилируйте класс, используя javac компилятор следующим образом —
538
Теперь запустите Java8Tester следующим образом —
544
Это должно дать следующий результат —
556
Вызов Java из JavaScript
В следующем примере показано, как импортировать и использовать классы Java в сценарии Java.
Создайте и сохраните файл sample.js. в папке c:\>JAVA.
sample.js
566
Откройте консоль и используйте следующую команду.
579
Он должен произвести следующий вывод —
580
Java 8 — новый API даты/времени
В Java 8 представлен новый API даты и времени, который устраняет следующие недостатки старого API даты и времени.
-
Небезопасно для потоков − java.util.Date не является потокобезопасным, поэтому разработчикам приходится иметь дело с проблемой параллелизма при использовании даты. Новый API даты и времени неизменяем и не имеет методов установки.
-
Плохой дизайн − Дата по умолчанию начинается с 1900, месяц начинается с 1, а день начинается с 0, поэтому единообразия нет. В старом API были менее прямые методы для операций с датами. Новый API предоставляет множество служебных методов для таких операций.
-
Сложная обработка часового пояса − Разработчикам пришлось написать много кода для решения проблем с часовыми поясами. Новый API был разработан с учетом специфики предметной области.
Java 8 представляет новый API даты и времени в пакете java.time. Ниже приведены некоторые важные классы, представленные в пакете java.time.
-
Местный − Упрощенный API даты и времени без сложной обработки часового пояса.
-
Зоны − Специализированный API даты и времени для работы с различными часовыми поясами.
Локальный API даты и времени
Классы LocalDate/LocalTime и LocalDateTime упрощают разработку, когда часовые пояса не требуются. Давайте посмотрим на них в действии.
Создайте следующую программу Java, используя любой редактор по вашему выбору, например, C:\> JAVA.
Java8Tester.java
Живая демонстрация590
Проверьте результат
Скомпилируйте класс, используя javac компилятор следующим образом —
609
Теперь запустите Java8Tester следующим образом —
613
Он должен произвести следующий вывод —
626
Зонированный API даты и времени
Зональный API даты и времени следует использовать, когда необходимо учитывать часовой пояс. Давайте посмотрим на них в действии.
Создайте следующую программу Java, используя любой редактор по вашему выбору, например, C:\> JAVA.
Java8Tester.java
Живая демонстрация635
Проверьте результат
Скомпилируйте класс, используя javac компилятор следующим образом —
642
Теперь запустите Java8Tester следующим образом —
658
Он должен произвести следующий вывод —
669
Перечисление единиц времени
Перечисление java.time.temporal.ChronoUnit добавлено в Java 8 для замены целочисленных значений, используемых в старом API для представления дня, месяца и т. д. Давайте посмотрим на них в действии.
Создайте следующую программу Java, используя любой редактор по вашему выбору, например, C:\> JAVA.
Java8Tester.java
Живая демонстрация673
Проверьте результат
Скомпилируйте класс, используя javac компилятор следующим образом —
688
Теперь запустите Java8Tester следующим образом —
699
Это должно дать следующий результат —
702
Период и продолжительность
В Java 8 введены два специализированных класса для работы с разницей во времени.
-
Период − Он имеет дело с количеством времени, основанным на дате.
-
Продолжительность − Это касается количества времени, основанного на времени.
Давайте посмотрим на них в действии.
Создайте следующую программу Java, используя любой редактор по вашему выбору, например, C:\> JAVA.
Java8Tester.java
Живая демонстрация714
Проверьте результат
Скомпилируйте класс, используя javac компилятор следующим образом —
728
Теперь запустите Java8Tester следующим образом —
730
Он должен произвести следующий вывод —
748
Настройщики времени
TemporalAdjuster используется для выполнения математических операций с датами. Например, получить «Вторая суббота месяца» или «Следующий вторник». Давайте посмотрим на них в действии.
Создайте следующую программу Java, используя любой редактор по вашему выбору, например, C:\> JAVA.
Java8Tester.java
Живая демонстрация755
Проверьте результат
Скомпилируйте класс, используя javac компилятор следующим образом —
761
Теперь запустите Java8Tester следующим образом —
775
Это должно дать следующий результат —
785
Обратная совместимость
К исходным объектам Date и Calendar добавляется метод toInstant(), который можно использовать для их преобразования в новый API Date-Time. Используйте метод ofInstant(Insant,ZoneId) для получения объекта LocalDateTime или ZonedDateTime. Давайте посмотрим на них в действии.
Создайте следующую программу Java, используя любой редактор по вашему выбору, например, C:\> JAVA.
Java8Tester.java
Живая демонстрация790
Проверьте результат
Скомпилируйте класс, используя javac компилятор следующим образом —
806
Теперь запустите Java8Tester следующим образом —
810
Он должен произвести следующий вывод —
827
Java 8 — Base64
С появлением Java 8 Base64 наконец получил должное. Java 8 теперь имеет встроенный кодировщик и декодер для кодирования Base64. В Java 8 мы можем использовать три типа кодировки Base64.
-
Простой − Выход сопоставляется с набором символов, лежащих в A-Za-z0-9+/. Кодер не добавляет в вывод никакой перевод строки, а декодер отклоняет любой символ, кроме A-Za-z0-9+/.
-
URL − Выход сопоставляется с набором символов, лежащих в A-Za-z0-9+_. Выходные данные безопасны для URL и имени файла.
-
MIME − Выход преобразуется в удобный для MIME формат. Вывод представлен строками не более чем по 76 символов каждая и использует возврат каретки '\r', за которым следует перевод строки '\n' в качестве разделителя строк. В конце закодированного вывода нет разделителя строк.
Вложенные классы
Сер.№ | Вложенный класс и описание |
---|---|
1 | <тд>|
2 | <тд>
Методы
Сер.№ | Название и описание метода |
---|---|
1 | <тд>|
2 | <тд>|
3 | <тд>|
4 | <тд>|
5 | <тд>|
6 | <тд>|
7 | <тд>
Унаследованные методы
Этот класс наследует методы от следующего класса —
- java.lang.Объект
Пример Base64
Создайте следующую программу Java, используя любой редактор по вашему выбору, скажем, C:/> JAVA.
Java8Tester.java
Живая демонстрация838
Проверьте результат
Скомпилируйте класс, используя javac компилятор следующим образом —
843
Теперь запустите Java8Tester следующим образом —
858
Он должен произвести следующий вывод —
860
java
- Java вектор
- Фрезерование - краткое руководство
- Краткое руководство по разработке и выполнению PM
- Краткое руководство по страхованию от сбоев в цепочке поставок
- Краткое руководство по станку для гибки квадратных труб
- Краткое руководство по машине холодного отжима
- Краткое руководство по планетарной коробке передач
- Краткое руководство по струйной мельнице
- Краткое руководство по сервопрессу
- Краткое руководство по пневматическим цилиндрам