SlideShare a Scribd company logo
1 of 59
Аннотации, Анонимные
классы, Lambda-выражения
Аннотации в Java — это механизм, позволяющий добавлять
в созданный код, некую дополнительную информацию,
называемую метаданными. Эта информация может
использоваться на этапе компиляции кода, на этапе сборки
приложения или на этапе выполнения. Аннотации появились
в Java начиная с версии Java 5.
Есть аннотации, встроенные в язык Java его разработчиками, a еще
есть механизм, позволяющий программисту создавать свои
собственные аннотации.
В краткой форме описания аннотация выглядит так:
@AnnotationName
Аннотация также может содержать атрибуты,
тогда она будет выглядеть так:
@AnnotationName (attribute1 = "value1",
attribute2 = "value2"),
где attribute1 и attribute2 — имена атрибутов,
а value1 и value2 — значения атрибутов.
Есть аннотации, встроенные в язык Java его
разработчиками.
Это, например, такие аннотации:
@Deprecated
@Override
@SuppressWarnings
@Deprecated
Аннотация говорит о том, что объект, перед
которым она расположена уже считается
устаревшим и скоро будет удален из
реализации языка. Во время компиляции,
компилятор будет выдавать
предупреждающие сообщения о каждом
случае использования устаревшего объекта.
@Override
Используется в классе наследнике перед
переопределяемым методом базового класса. Данный
атрибут не является обязательным и переопределение
метода можно выполнять и без него. Однако,
рекомендуется всегда указывать этот атрибут перед
переопределяемыми методами, чтобы человек,
работающий с классом, понимал, что такие методы
определены в базовом классе, и при их переопределении
требуется сохранять соответствие сигнатуры. Если вы не
укажете эту аннотацию при переопределении методов
базового класса, компилятор выведет вам
предупреждение о том, что метод в классе наследнике не
переопределяет метод базового класса.
@SuppressWarnings
Используется для того, чтобы подавлять
предупреждения компилятора, например, об
использовании небезопасного
преобразования типов, об использовании
устаревших методов и т.п.
Пользовательские аннотации
Пользователь может создавать свои
собственные аннотации. Рассмотрим этот
процесс. Аннотация создается в собственном
отдельном файле, как класс или интерфейс.
Определяется аннотация таким образом:
Вызывается, как и обычная аннотация, через
знак @
Создавая свою аннотацию, вы можете указать
к каким элементам она должна применяться.
Если бы мы хотели указать при определении
нашей аннотации, что она должна
применяться только к типам (классам,
интерфейсам, перечислениям), то наше
определение примет следующий вид:
Класс ElementType содержит такие допустимые
значения для области применимости аннотации:
ElementType.ANNOTATION_TYPE
ElementType.CONSTRUCTOR
ElementType.FIELD
ElementType.LOCAL_VARIABLE
ElementType.METHOD
ElementType.PACKAGE ElementType.PARAMETER
ElementType.TYPE
Если при определении своей аннотации
указать еще аннотацию @Inherited, то
созданная вами аннотация будет
передаваться и классам наследникам, если
таковые будут у вашего класса.
Получить доступ к аннотации можно
через Рефлексию
Важно!
Чтобы иметь возможность получить доступ к
аннотации через рефлексию, у сигнатуры
аннотации должен быть активирован флаг
@Retention(RetentionPolicy.RUNTIME)
Отличие TYPE от TYPE_USE
TYPE_USE может использоваться для
аннотирования анонимных классов.
TYPE нет.
Анонимные классы
Зачем нужны анонимные классы?
Чтобы реализовать какую-то логику внутри
блока кода
ВНИМАНИЕ!
Мы можем создать экземпляр абстрактного
класса, если он будет анонимным
вложенным классом.
Запись анонимного класса
подразумевает
Что создается новый класс, который
наследует все методы указанного, но
переопределяет определенные методы.
Можно получить различные
аннотации класса
Однако получить аннотацию типа НЕ
ПОЛУЧИТСЯ. Это БАГ Java.
Также, мы таким образом можем
реализовать интерфейсы
В переопределении интерфейсов мы можем
задать свои переменные в теле анонимного
класса, но не можем в конструкторе, т.к. у
него нет такого конструктора.
Если же в классе создать конструктор с
параметрами, можно использовать и его при
создании анонимных классов
Также, с его помощью мы можем передавать методы в
объекты, которые до этого не были созданы
Lambda выражения
Это метод, записанный в сокращенном
варианте.
Имеет синтаксис
[параметры] -> {[тело метода]}
Применяется, в основном, в Stream API, при
работе с функциональными классами
Повсеместно, когда встречается
интерфейс, реализация которого
заключается в одном методе
Это выглядит ужасно громоздко.
Особенно, когда таких блоков требуется
создать несколько.
Для повышения удобства и были созданы
lambda-методы (с Java 8)
Код на слайде выше идентичен. Различается
только запись.
Lambda
Может принимать 0, 1 либо несколько
параметров
Если у нас 1 параметр, мы можем как
указывать его в скобках, так и указать без
скобок
Просто так запустить их не удастся
Требуется определенный контекст
Также, мы можем делать их
замостоятельно.
Обратите внимание, что Lambda, как и
анонимные классы, позволяют нам
реализовывать интерфейсы анонимно и
вызывать их как объект
Работает только, если интерфейс
объявляет один-единственный
метод
Даже если у нас будет несколько
методов с одной сигнатурой
Но можно объявлять default методы,
но их обязательно нужно будет
реализовать
Имена переменных могут не
совпадать
Т.к. у нас один единственный метод и их
параметрами, то Java подставит все
автоматически.
Но нарушать порядок вызова
параметров нельзя
Также можно указать тип
параметров, но это не обязательно
Передача параметров
До Java 8 передаваемая переменная должна
была быть final
Сейчас это не обязательно
Но это переменная все равно
обязана оставаться final (не должна
меняться)
По умолчанию, такой параметр
implicilty (неявно) final
Внутри тела выражения также менять эту
переменную нельзя!
Также используется для
функционального
программирования
Когда мы lambda-выражение хотим
использовать множество раз.
• Это возможность использовать чистую
функцию без доп. эффектов
• Чище код
• Чистая функция, которая не изменяет
состояние объекта (implicitly final, помните?)
• Либо использовать в качестве callback’ов
Есть заготовленные функ.
Интерфейсы типа Predicate
Другие выражения
• Predicate
• Consumer
• Function
• Supplier
• UnaryOperator
• BinaryOperator
Consumer
Один входной параметр,
Нет выходный параметров.
Function
• Принимает 2 generic типа
• Первый – входной
• Второй - выходной
Supplier<T>
Где T – выходной тип
На вход – 0 параметров
UnaryOperator<T>
T – тип принимаемого и возвращаемого
значения.
BinaryOperator<T>
Где Т – тип двух параметров
В данных случаях также нельзя
менять значения внешних
параметров
Остальные хранятся в
java.lang.function (40+)
Для того чтобы самому создать
функциональный интерфейс
Можно пометить его аннотацией
@FunctionalInterface, но это будет просто для
читаемости. Это ни на что не влияет
По сути
Нам надо создать сигнатуру метода в
интерфейсе, чем выходной , определен (void
либо Generic), и входной будет Generic

More Related Content

What's hot

Принципы объектно-ориентированного дизайна
Принципы объектно-ориентированного дизайнаПринципы объектно-ориентированного дизайна
Принципы объектно-ориентированного дизайнаСергей Шебанин
 
Как писать красивый код или основы SOLID
Как писать красивый код или основы SOLIDКак писать красивый код или основы SOLID
Как писать красивый код или основы SOLIDPavel Tsukanov
 
Шаблоны разработки ПО. Часть 1. Введние
Шаблоны разработки ПО. Часть 1. ВведниеШаблоны разработки ПО. Часть 1. Введние
Шаблоны разработки ПО. Часть 1. ВведниеSergey Nemchinsky
 
Отладка и оптимизация многопоточных OpenMP-программ
Отладка и оптимизация многопоточных OpenMP-программОтладка и оптимизация многопоточных OpenMP-программ
Отладка и оптимизация многопоточных OpenMP-программTatyanazaxarova
 
C++ осень 2012 лекция 6
C++ осень 2012 лекция 6C++ осень 2012 лекция 6
C++ осень 2012 лекция 6Technopark
 
Равиль Губайдуллин - Annotation processing
Равиль Губайдуллин - Annotation processingРавиль Губайдуллин - Annotation processing
Равиль Губайдуллин - Annotation processingProvectus
 
Введение в язык программирования «Java»
Введение в язык программирования «Java»Введение в язык программирования «Java»
Введение в язык программирования «Java»Unguryan Vitaliy
 
Разработка пользовательских элементов управления в WPF
Разработка пользовательских элементов управления в WPFРазработка пользовательских элементов управления в WPF
Разработка пользовательских элементов управления в WPFCUSTIS
 
Глава 3: примитивные типы и операции с ними в Java
Глава 3: примитивные типы и операции с ними в JavaГлава 3: примитивные типы и операции с ними в Java
Глава 3: примитивные типы и операции с ними в Javametaform
 
Java core-lect6-part3-annotation.ppt
Java core-lect6-part3-annotation.pptJava core-lect6-part3-annotation.ppt
Java core-lect6-part3-annotation.pptAnton Moiseenko
 
GRASP – паттерны Объектно-Ориентированного Проектирования
GRASP – паттерны Объектно-Ориентированного ПроектированияGRASP – паттерны Объектно-Ориентированного Проектирования
GRASP – паттерны Объектно-Ориентированного ПроектированияAlexander Nemanov
 
C++ осень 2013 лекция 5
C++ осень 2013 лекция 5C++ осень 2013 лекция 5
C++ осень 2013 лекция 5Technopark
 
C++ осень 2013 лекция 3
C++ осень 2013 лекция 3C++ осень 2013 лекция 3
C++ осень 2013 лекция 3Technopark
 
Java. Generic - шаблонные типы.
Java.  Generic - шаблонные типы.Java.  Generic - шаблонные типы.
Java. Generic - шаблонные типы.Unguryan Vitaliy
 
Шаблоны разработки ПО. Часть 2. ООП и UML
Шаблоны разработки ПО. Часть 2. ООП и UMLШаблоны разработки ПО. Часть 2. ООП и UML
Шаблоны разработки ПО. Часть 2. ООП и UMLSergey Nemchinsky
 
SOLID & GRASP
SOLID & GRASPSOLID & GRASP
SOLID & GRASPdevel123
 

What's hot (20)

Принципы объектно-ориентированного дизайна
Принципы объектно-ориентированного дизайнаПринципы объектно-ориентированного дизайна
Принципы объектно-ориентированного дизайна
 
Как писать красивый код или основы SOLID
Как писать красивый код или основы SOLIDКак писать красивый код или основы SOLID
Как писать красивый код или основы SOLID
 
Шаблоны разработки ПО. Часть 1. Введние
Шаблоны разработки ПО. Часть 1. ВведниеШаблоны разработки ПО. Часть 1. Введние
Шаблоны разработки ПО. Часть 1. Введние
 
Uml
UmlUml
Uml
 
Отладка и оптимизация многопоточных OpenMP-программ
Отладка и оптимизация многопоточных OpenMP-программОтладка и оптимизация многопоточных OpenMP-программ
Отладка и оптимизация многопоточных OpenMP-программ
 
C++ осень 2012 лекция 6
C++ осень 2012 лекция 6C++ осень 2012 лекция 6
C++ осень 2012 лекция 6
 
Равиль Губайдуллин - Annotation processing
Равиль Губайдуллин - Annotation processingРавиль Губайдуллин - Annotation processing
Равиль Губайдуллин - Annotation processing
 
java 8
java 8java 8
java 8
 
Введение в язык программирования «Java»
Введение в язык программирования «Java»Введение в язык программирования «Java»
Введение в язык программирования «Java»
 
Step 1
Step 1Step 1
Step 1
 
Разработка пользовательских элементов управления в WPF
Разработка пользовательских элементов управления в WPFРазработка пользовательских элементов управления в WPF
Разработка пользовательских элементов управления в WPF
 
Глава 3: примитивные типы и операции с ними в Java
Глава 3: примитивные типы и операции с ними в JavaГлава 3: примитивные типы и операции с ними в Java
Глава 3: примитивные типы и операции с ними в Java
 
Java core-lect6-part3-annotation.ppt
Java core-lect6-part3-annotation.pptJava core-lect6-part3-annotation.ppt
Java core-lect6-part3-annotation.ppt
 
GRASP – паттерны Объектно-Ориентированного Проектирования
GRASP – паттерны Объектно-Ориентированного ПроектированияGRASP – паттерны Объектно-Ориентированного Проектирования
GRASP – паттерны Объектно-Ориентированного Проектирования
 
C++ осень 2013 лекция 5
C++ осень 2013 лекция 5C++ осень 2013 лекция 5
C++ осень 2013 лекция 5
 
Fody - AOP
Fody - AOPFody - AOP
Fody - AOP
 
C++ осень 2013 лекция 3
C++ осень 2013 лекция 3C++ осень 2013 лекция 3
C++ осень 2013 лекция 3
 
Java. Generic - шаблонные типы.
Java.  Generic - шаблонные типы.Java.  Generic - шаблонные типы.
Java. Generic - шаблонные типы.
 
Шаблоны разработки ПО. Часть 2. ООП и UML
Шаблоны разработки ПО. Часть 2. ООП и UMLШаблоны разработки ПО. Часть 2. ООП и UML
Шаблоны разработки ПО. Часть 2. ООП и UML
 
SOLID & GRASP
SOLID & GRASPSOLID & GRASP
SOLID & GRASP
 

Similar to Step 5

курс Java 2016. занятие 03. интерфейсы, generic, исключения
курс Java 2016. занятие 03. интерфейсы, generic, исключениякурс Java 2016. занятие 03. интерфейсы, generic, исключения
курс Java 2016. занятие 03. интерфейсы, generic, исключения7bits
 
Inroducing SAP ABAP - Presentation with basics SAP ABAP
Inroducing SAP ABAP - Presentation with basics SAP ABAPInroducing SAP ABAP - Presentation with basics SAP ABAP
Inroducing SAP ABAP - Presentation with basics SAP ABAPmikhailshurgulaya
 
C++ весна 2014 лекция 5
C++ весна 2014 лекция 5C++ весна 2014 лекция 5
C++ весна 2014 лекция 5Technopark
 
VAMR ACADEMY Второе занятие
VAMR ACADEMY Второе занятиеVAMR ACADEMY Второе занятие
VAMR ACADEMY Второе занятиеmixARConference
 
презентация конспекта лекций
презентация конспекта лекцийпрезентация конспекта лекций
презентация конспекта лекцийstudent_kai
 
Как спроектировать хороший API и почему это так важно
Как спроектировать хороший API и почему это так важноКак спроектировать хороший API и почему это так важно
Как спроектировать хороший API и почему это так важноBubon Makabra
 
Общие темы. Тема 02.
Общие темы. Тема 02.Общие темы. Тема 02.
Общие темы. Тема 02.Igor Shkulipa
 
Pavel Rumantsev - Java Script
Pavel Rumantsev - Java ScriptPavel Rumantsev - Java Script
Pavel Rumantsev - Java Scriptbeloslab
 
введение в Javascript
введение в Javascriptвведение в Javascript
введение в Javascriptinqubick
 
9 структура компонентных приложений
9 структура компонентных приложений9 структура компонентных приложений
9 структура компонентных приложенийKewpaN
 
Как пройти собеседование и получить первую работу на Swift
Как пройти собеседование и получить первую работу на SwiftКак пройти собеседование и получить первую работу на Swift
Как пройти собеседование и получить первую работу на SwiftAnton Loginov
 
Базы данных лекция №7
Базы данных лекция №7Базы данных лекция №7
Базы данных лекция №7Vitaliy Pak
 
C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.Igor Shkulipa
 
презентация кметодическим указаниям к лаб. работам
презентация кметодическим указаниям к лаб. работампрезентация кметодическим указаниям к лаб. работам
презентация кметодическим указаниям к лаб. работамstudent_kai
 
Лекция 6_принципы ООП : инкапсуляция, наследование
Лекция 6_принципы ООП : инкапсуляция, наследованиеЛекция 6_принципы ООП : инкапсуляция, наследование
Лекция 6_принципы ООП : инкапсуляция, наследованиеmetaform
 
Введение в hibernate
Введение в hibernateВведение в hibernate
Введение в hibernateUnguryan Vitaliy
 
Dependency injection
Dependency injectionDependency injection
Dependency injectionGetDev.NET
 

Similar to Step 5 (20)

Step 3.2
Step 3.2Step 3.2
Step 3.2
 
курс Java 2016. занятие 03. интерфейсы, generic, исключения
курс Java 2016. занятие 03. интерфейсы, generic, исключениякурс Java 2016. занятие 03. интерфейсы, generic, исключения
курс Java 2016. занятие 03. интерфейсы, generic, исключения
 
Inroducing SAP ABAP - Presentation with basics SAP ABAP
Inroducing SAP ABAP - Presentation with basics SAP ABAPInroducing SAP ABAP - Presentation with basics SAP ABAP
Inroducing SAP ABAP - Presentation with basics SAP ABAP
 
C++ весна 2014 лекция 5
C++ весна 2014 лекция 5C++ весна 2014 лекция 5
C++ весна 2014 лекция 5
 
VAMR ACADEMY Второе занятие
VAMR ACADEMY Второе занятиеVAMR ACADEMY Второе занятие
VAMR ACADEMY Второе занятие
 
презентация конспекта лекций
презентация конспекта лекцийпрезентация конспекта лекций
презентация конспекта лекций
 
Как спроектировать хороший API и почему это так важно
Как спроектировать хороший API и почему это так важноКак спроектировать хороший API и почему это так важно
Как спроектировать хороший API и почему это так важно
 
Общие темы. Тема 02.
Общие темы. Тема 02.Общие темы. Тема 02.
Общие темы. Тема 02.
 
Pavel Rumantsev - Java Script
Pavel Rumantsev - Java ScriptPavel Rumantsev - Java Script
Pavel Rumantsev - Java Script
 
введение в Javascript
введение в Javascriptвведение в Javascript
введение в Javascript
 
9 структура компонентных приложений
9 структура компонентных приложений9 структура компонентных приложений
9 структура компонентных приложений
 
TypeScript
TypeScriptTypeScript
TypeScript
 
Как пройти собеседование и получить первую работу на Swift
Как пройти собеседование и получить первую работу на SwiftКак пройти собеседование и получить первую работу на Swift
Как пройти собеседование и получить первую работу на Swift
 
лек5 6
лек5 6лек5 6
лек5 6
 
Базы данных лекция №7
Базы данных лекция №7Базы данных лекция №7
Базы данных лекция №7
 
C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.
 
презентация кметодическим указаниям к лаб. работам
презентация кметодическим указаниям к лаб. работампрезентация кметодическим указаниям к лаб. работам
презентация кметодическим указаниям к лаб. работам
 
Лекция 6_принципы ООП : инкапсуляция, наследование
Лекция 6_принципы ООП : инкапсуляция, наследованиеЛекция 6_принципы ООП : инкапсуляция, наследование
Лекция 6_принципы ООП : инкапсуляция, наследование
 
Введение в hibernate
Введение в hibernateВведение в hibernate
Введение в hibernate
 
Dependency injection
Dependency injectionDependency injection
Dependency injection
 

Step 5

  • 2. Аннотации в Java — это механизм, позволяющий добавлять в созданный код, некую дополнительную информацию, называемую метаданными. Эта информация может использоваться на этапе компиляции кода, на этапе сборки приложения или на этапе выполнения. Аннотации появились в Java начиная с версии Java 5. Есть аннотации, встроенные в язык Java его разработчиками, a еще есть механизм, позволяющий программисту создавать свои собственные аннотации. В краткой форме описания аннотация выглядит так: @AnnotationName
  • 3. Аннотация также может содержать атрибуты, тогда она будет выглядеть так: @AnnotationName (attribute1 = "value1", attribute2 = "value2"), где attribute1 и attribute2 — имена атрибутов, а value1 и value2 — значения атрибутов.
  • 4. Есть аннотации, встроенные в язык Java его разработчиками. Это, например, такие аннотации: @Deprecated @Override @SuppressWarnings
  • 5. @Deprecated Аннотация говорит о том, что объект, перед которым она расположена уже считается устаревшим и скоро будет удален из реализации языка. Во время компиляции, компилятор будет выдавать предупреждающие сообщения о каждом случае использования устаревшего объекта.
  • 6. @Override Используется в классе наследнике перед переопределяемым методом базового класса. Данный атрибут не является обязательным и переопределение метода можно выполнять и без него. Однако, рекомендуется всегда указывать этот атрибут перед переопределяемыми методами, чтобы человек, работающий с классом, понимал, что такие методы определены в базовом классе, и при их переопределении требуется сохранять соответствие сигнатуры. Если вы не укажете эту аннотацию при переопределении методов базового класса, компилятор выведет вам предупреждение о том, что метод в классе наследнике не переопределяет метод базового класса.
  • 7. @SuppressWarnings Используется для того, чтобы подавлять предупреждения компилятора, например, об использовании небезопасного преобразования типов, об использовании устаревших методов и т.п.
  • 8. Пользовательские аннотации Пользователь может создавать свои собственные аннотации. Рассмотрим этот процесс. Аннотация создается в собственном отдельном файле, как класс или интерфейс. Определяется аннотация таким образом:
  • 9. Вызывается, как и обычная аннотация, через знак @
  • 10. Создавая свою аннотацию, вы можете указать к каким элементам она должна применяться. Если бы мы хотели указать при определении нашей аннотации, что она должна применяться только к типам (классам, интерфейсам, перечислениям), то наше определение примет следующий вид:
  • 11. Класс ElementType содержит такие допустимые значения для области применимости аннотации: ElementType.ANNOTATION_TYPE ElementType.CONSTRUCTOR ElementType.FIELD ElementType.LOCAL_VARIABLE ElementType.METHOD ElementType.PACKAGE ElementType.PARAMETER ElementType.TYPE
  • 12. Если при определении своей аннотации указать еще аннотацию @Inherited, то созданная вами аннотация будет передаваться и классам наследникам, если таковые будут у вашего класса.
  • 13.
  • 14. Получить доступ к аннотации можно через Рефлексию
  • 15. Важно! Чтобы иметь возможность получить доступ к аннотации через рефлексию, у сигнатуры аннотации должен быть активирован флаг @Retention(RetentionPolicy.RUNTIME)
  • 16. Отличие TYPE от TYPE_USE TYPE_USE может использоваться для аннотирования анонимных классов. TYPE нет.
  • 17. Анонимные классы Зачем нужны анонимные классы? Чтобы реализовать какую-то логику внутри блока кода
  • 18. ВНИМАНИЕ! Мы можем создать экземпляр абстрактного класса, если он будет анонимным вложенным классом.
  • 19.
  • 20. Запись анонимного класса подразумевает Что создается новый класс, который наследует все методы указанного, но переопределяет определенные методы.
  • 22. Однако получить аннотацию типа НЕ ПОЛУЧИТСЯ. Это БАГ Java.
  • 23. Также, мы таким образом можем реализовать интерфейсы
  • 24. В переопределении интерфейсов мы можем задать свои переменные в теле анонимного класса, но не можем в конструкторе, т.к. у него нет такого конструктора.
  • 25. Если же в классе создать конструктор с параметрами, можно использовать и его при создании анонимных классов
  • 26. Также, с его помощью мы можем передавать методы в объекты, которые до этого не были созданы
  • 27. Lambda выражения Это метод, записанный в сокращенном варианте. Имеет синтаксис [параметры] -> {[тело метода]} Применяется, в основном, в Stream API, при работе с функциональными классами
  • 28. Повсеместно, когда встречается интерфейс, реализация которого заключается в одном методе
  • 29. Это выглядит ужасно громоздко. Особенно, когда таких блоков требуется создать несколько. Для повышения удобства и были созданы lambda-методы (с Java 8)
  • 30.
  • 31. Код на слайде выше идентичен. Различается только запись.
  • 32. Lambda Может принимать 0, 1 либо несколько параметров Если у нас 1 параметр, мы можем как указывать его в скобках, так и указать без скобок
  • 33. Просто так запустить их не удастся Требуется определенный контекст
  • 34.
  • 35. Также, мы можем делать их замостоятельно.
  • 36. Обратите внимание, что Lambda, как и анонимные классы, позволяют нам реализовывать интерфейсы анонимно и вызывать их как объект
  • 37. Работает только, если интерфейс объявляет один-единственный метод
  • 38. Даже если у нас будет несколько методов с одной сигнатурой
  • 39. Но можно объявлять default методы, но их обязательно нужно будет реализовать
  • 40. Имена переменных могут не совпадать Т.к. у нас один единственный метод и их параметрами, то Java подставит все автоматически.
  • 41. Но нарушать порядок вызова параметров нельзя
  • 42. Также можно указать тип параметров, но это не обязательно
  • 43. Передача параметров До Java 8 передаваемая переменная должна была быть final
  • 44.
  • 45. Сейчас это не обязательно
  • 46. Но это переменная все равно обязана оставаться final (не должна меняться)
  • 47. По умолчанию, такой параметр implicilty (неявно) final Внутри тела выражения также менять эту переменную нельзя!
  • 48. Также используется для функционального программирования Когда мы lambda-выражение хотим использовать множество раз. • Это возможность использовать чистую функцию без доп. эффектов • Чище код • Чистая функция, которая не изменяет состояние объекта (implicitly final, помните?) • Либо использовать в качестве callback’ов
  • 50. Другие выражения • Predicate • Consumer • Function • Supplier • UnaryOperator • BinaryOperator
  • 51. Consumer Один входной параметр, Нет выходный параметров.
  • 52. Function • Принимает 2 generic типа • Первый – входной • Второй - выходной
  • 53. Supplier<T> Где T – выходной тип На вход – 0 параметров
  • 54. UnaryOperator<T> T – тип принимаемого и возвращаемого значения.
  • 55. BinaryOperator<T> Где Т – тип двух параметров
  • 56. В данных случаях также нельзя менять значения внешних параметров
  • 58. Для того чтобы самому создать функциональный интерфейс Можно пометить его аннотацией @FunctionalInterface, но это будет просто для читаемости. Это ни на что не влияет
  • 59. По сути Нам надо создать сигнатуру метода в интерфейсе, чем выходной , определен (void либо Generic), и входной будет Generic