java tutorial - Синтаксис и новые функции в Java 8 - учебник java - java programming - учиться java - java basics - java for beginners
1- Введение
- С момента изобретения Java до обновления синтаксиса и функций, стоит отметить несколько важных этапов:
- Java 1.0: Начало языка программирования.
- Java 1.1, 1.2, 1.3, 1.4 не так много изменений в синтаксисе и функции.
- Java 1.5 (Или Java 5) произошли большие изменения вместе с добавлением некоторых новых понятий.
- Generic (Общий)
- Autoboxing/Unboxing (Упаковка/распаковка)
- Обновление функции цикла for ("foreach").
- Виды перечисления. (Type-safe enumerations).
- Varargs (Переменные аргументы)
- Статический импорт (Static import)
- Metadata (Метаданные)
- Java 6,7 нет больших изменений в языке.
- Java 8 произошло большое изменение в языке, наряду с добавлением некоторых новых понятий и функций:
- Методы по умолчанию для интерфейса(Default interface methods)
- Lambda выражения (Lambda expressions)
- Справочные методы
- Повторяющиеся аннотации (Repeatable annotations)
- Поток (stream)
- В этой статье я ознакомлю вас с функциями и синтаксисами Java 8.
2- Методы по умолчанию для интерфейса
- Java 8 позволяет вам добавить невизуальный метод в интерфейс, используя ключевок слово default. Эти методы понимаются как расширенные методы. Это ваш первый пример:
Formula.java
- И класс FormulaImpl реализует interface Formula.
FormulaImpl.java
FormulaTest.java
3- Functional Interface (Функциональный интерфейс)
- Java8 считает, что интерфейсы имеют один абстрактный метод - это Functional Interface (функциональный интерфейс). Вы можете использовать аннотацию @FuctionalInterface, чтобы отметить ваш интерфейс как Функциональный интерфейс, это не обязательно. Однако компилятор (complier) Java уведомит вас об ошибке, если по нечаянно добавить другой абстрактный метод в интерфейс, отмеченный этой аннотацией.
- Ниже являются некоторые практические примеры с @FunctionalInterface:
- Приведенный ниже пример является действительным FunctionalInterface, потому что он имеет только один абстрактный метод.
Foo.java
Недействительно:
java - джава - учиться java - учебник java -
функциональный интерфейс
- примеры java - java-программы
Действительно:
java - джава - учиться java - учебник java -
компаратор
- примеры java - java-программы
Недействительно:
java - джава - учиться java - учебник java -
клон-java
- примеры java - java-программы
Действительно:
java - джава - учиться java - учебник java -
пакет java
- примеры java - java-программы
4- Выражение Lambda
- Сначала мы рассмотрим, как Java до версии 8 организует Collection.
SortBefore8Example.java
- Результат запуска примера выше:
java - джава - учиться java - учебник java -
сортировать перед
- примеры java - java-программы
- Java 8 считает что интерфейсы, имеют только один метод, который является функциональным интерфейсом ( Functional Interface). Соответственно, при реализации интерфейса вам нужно всего лишь написать метод, реализующий этот единственный абстрактный метод. Comparator - это интерфейс, имеющий только один абстрактный метод, и это функциональный интерфейс ( Functional Interface). Вы можете переписать приведенный выше пример с синтаксисом Lambda Java 8:
SortJava8Example.java
- В блоке команд, если есть только одна команды, вы можете удалить { }, и вы можете написать этот раздел кода более кратким образом.
- Даже компилятор (compilier) Java достаточно умен, чтобы определить, какой вид элементов вам нужно организовать, в этом примере это вид String. Таким образом, компаратор ( Comparator), безусловно, означает сравнение видов данных String. Вы можете написать это более кратко.
Другие примеры с выражением Lambda.
Converter.java
- Используйте интерфейс Converter в виде Java до версии 8 (это означает, что не используйте Lambda).
ConverterBefore8Example.java
- Использование выражения Lambda на Java 8:
ConveterJava8Example.java
5- Functional Interface API
- Java 8 имеет большое количество доступных разработанных Functional Interface, они находятся в пакете java.util.function, здесь я покажу вам как использовать некоторые из этих интерфейсов, чтобы лучше понять выражение Lambda и их полезность.
5.1- java.util.function.Consumer
- Consumer (Потребитель) - это доступный функциональный интерфейс Java 8. Он имеет единственный абстрактный метод, принимающий входной параметр, и этот метод ничего не возвращает.
Consumer.java
- Использование метода List.forEach(Consumer):
ConsumerExample.java
5.2- java.util.function.Predicate
- Predicate - это доступный функциональный интерфейс Java 8. Он имеет единственный абстрактный метод, принимающий входной параметр, и метод возвращает значение boolean (true / false). Этот метод используется для оценки того, подходит ли входной параметр для чего-то логического или нет.
Predicate.java
- В следующем примере мы будем фильтровать список целых нечетных чисел, используя Predicate, принимающий форму Java8 и предыдущих версий.
PredicateExample.java
5.3- java.util.function.Function
- Function - это доступный функциональный интерфейс Java 8. Он имеет единственный абстрактный метод, принимающий входной параметр, и метод возвращает другой объект.
Function.java
- Пример: Дан список String, распечатайте String в списке с заглавными буквами
FunctionExample.java
- Аналогичные функциональные интерфейсы (Functional interface):
- java.util.function.IntFunction
- java.util.function.DoubleFunction
- java.util.function.LongFunction
5.4- java.util.function.Supplier
- Supplier - это доступный функциональный интерфейс Java 8. Он имеет единственный абстрактный метод без параметра, а метод возвращает объект.
Supplier.java
SupplierExample.java
- Аналогичные функциональные интерфейсы (Functional interface):
- java.util.function.BooleanSupplier
- java.util.function.IntSupplier
- java.util.function.DoubleSupplier
- java.util.function.LongSupplier
6- Method reference
- Это функция, связанная с выражением Lambda. Она позволяет вам ссылаться на другие конструкторы или методы, не выполняя их. Ссылки на методы (method references) и Lambda аналогичны тем, что они оба требуют один вид цели, это совместимый функциональный интерфейс.
- Java 8 позволяет передавать ссылку метода или конструктора с помощью ключевого слова ::
- Прежде чем смотреть на детали, давайте посмотрим простой пример.
- MyFunction - это функциональный интерфейс. Он определяет метод, который имеет два параметра: int a и b и возвращает значение int.
MyFunction.java
- MyMathUtils - это класс с двумя статическими методами, используемыми для вычисления суммы и разность двух чисел int
MyMathUtils.java
MethodReferenceExample.java
- По примеру выше, вы можете увидеть способ использования ключевого слова :: чтобы передать ссылку метода. Если вы вызываете метод, а в том методе имеется аргумент Functional Interface, вы можете передать метод ссылки со структурой похожей на структуру метода определения в Functional interface.