Слайд 2Методы интерфейсов по умолчанию
Java 8 позволяет вам добавлять не абстрактные реализации методов
![Методы интерфейсов по умолчанию Java 8 позволяет вам добавлять не абстрактные реализации](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1046761/slide-1.jpg)
в интерфейс, используя ключевое слово default. Эта новшество также известно, как метод расширения.
Слайд 3Лямбда - выражения
Лямбда - выражение представляет собой блок кода, который можно передать
![Лямбда - выражения Лямбда - выражение представляет собой блок кода, который можно](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1046761/slide-2.jpg)
в другое место, поэтому он может быть выполнен позже, один или несколько раз.
Слайд 4Лямбда - выражения
Синтаксис
(список параметров) -> исполняемый код;
(String firstStr, String secondStr)
![Лямбда - выражения Синтаксис (список параметров) -> исполняемый код; (String firstStr, String](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1046761/slide-3.jpg)
-> {
if (firstStr.length() < secondStr.length()) return -1;
else if (firstStr.length() > secondStr.length()) return 1;
else return 0;
}
Слайд 5Лямбда - выражения
Если лямбда-выражение не имеет параметров, вы все равно необходимо ставить
![Лямбда - выражения Если лямбда-выражение не имеет параметров, вы все равно необходимо](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1046761/slide-4.jpg)
пустые скобки.
() -> {
for (int i = 0; i < 1000; i++) doWork();
}
Слайд 6Функциональные интерфейсы
Каждой лямбде соответствует тип, представленный интерфейсом. Так называемый функциональный интерфейс должен
![Функциональные интерфейсы Каждой лямбде соответствует тип, представленный интерфейсом. Так называемый функциональный интерфейс](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1046761/slide-5.jpg)
содержать ровно один абстрактный метод. Каждое лямбда-выражение этого типа будет сопоставлено объявленному методу.
Слайд 7Ссылки на методы и конструкторы
Java 8 позволяет вам передавать ссылки на методы
![Ссылки на методы и конструкторы Java 8 позволяет вам передавать ссылки на](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1046761/slide-6.jpg)
или конструкторы. Для этого нужно использовать оператор ::
Слайд 8Области действия лямбд
Доступ к переменным внешней области действия из лямбда-выражения очень схож
![Области действия лямбд Доступ к переменным внешней области действия из лямбда-выражения очень](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1046761/slide-7.jpg)
к доступу из анонимных классов. Вы можете ссылаться на переменные, объявленные как final, на экземплярные поля класса и статические переменные.
Слайд 9Доступ к методам интерфейсов по умолчанию
Внутри лямбда-выражений запрещено обращаться к методам по
![Доступ к методам интерфейсов по умолчанию Внутри лямбда-выражений запрещено обращаться к методам](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1046761/slide-8.jpg)
умолчанию. Следующий код не скомпилируется:
Formula formula = (a) -> sqrt( a * 100);
Слайд 10Встроенные функциональные интерфейсы
В JDK 1.8 содержит множество встроенных функциональных интерфейсов. Некоторые из
![Встроенные функциональные интерфейсы В JDK 1.8 содержит множество встроенных функциональных интерфейсов. Некоторые](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1046761/slide-9.jpg)
них хорошо известны по предыдущим версиям языка, например, Comparator или Runnable. Все эти интерфейсы были поддержаны в лямбдах добавлением аннотации @FunctionalInterface.
Слайд 11Встроенные функциональные интерфейсы
Однако в Java 8 также появилось много новых функциональных интерфейсов.
![Встроенные функциональные интерфейсы Однако в Java 8 также появилось много новых функциональных интерфейсов.](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1046761/slide-10.jpg)
Слайд 12Предикаты
Предикаты — это функции, принимающие один аргумент, и возвращающие значение типа boolean.
![Предикаты Предикаты — это функции, принимающие один аргумент, и возвращающие значение типа](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1046761/slide-11.jpg)
Интерфейс содержит различные методы по умолчанию, позволяющие строить сложные условия (and, or, negate).
Слайд 13Функции
Функции принимают один аргумент и возвращают некоторый результат. Методы по умолчанию могут
![Функции Функции принимают один аргумент и возвращают некоторый результат. Методы по умолчанию](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1046761/slide-12.jpg)
использоваться для построения цепочек вызовов (compose, andThen).
Слайд 14Поставщики
Поставщики (suppliers) предоставляют результат заданного типа. В отличии от функций, поставщики не
![Поставщики Поставщики (suppliers) предоставляют результат заданного типа. В отличии от функций, поставщики не принимают аргументов.](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1046761/slide-13.jpg)
принимают аргументов.
Слайд 15Потребители
Потребители (consumers) представляют собой операции, которые производятся на одним входным аргументом.
![Потребители Потребители (consumers) представляют собой операции, которые производятся на одним входным аргументом.](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1046761/slide-14.jpg)
Слайд 16Компараторы
Компараторы хорошо известны по предыдущим версиям Java. Java 8 добавляет в интерфейс
![Компараторы Компараторы хорошо известны по предыдущим версиям Java. Java 8 добавляет в](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1046761/slide-15.jpg)
различные методы по умолчанию.
Слайд 17Опциональные значения
Опциональные значения (optionals) не являются функциональными интерфейсами, однако являются удобным средством
![Опциональные значения Опциональные значения (optionals) не являются функциональными интерфейсами, однако являются удобным средством предотвращения NullPointerException.](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1046761/slide-16.jpg)
предотвращения NullPointerException.
Слайд 18Опциональные значения
Опциональные значение — это по сути контейнер для значения, которое может
![Опциональные значения Опциональные значение — это по сути контейнер для значения, которое](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1046761/slide-17.jpg)
быть равно null. Например, вам нужен метод, который возвращает какое-то значение, но иногда он должен возвращать пустое значение. Вместо того, чтобы возвращать null, в Java 8 вы можете вернуть опциональное значение.
Слайд 19Потоки
Тип java.util.Stream представляет собой последовательность элементов, над которой можно производить различные операции.
![Потоки Тип java.util.Stream представляет собой последовательность элементов, над которой можно производить различные](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1046761/slide-18.jpg)
Операции над потоками бывают или промежуточными (intermediate) или конечными (terminal). параллельно.
Слайд 20Потоки
Конечные операции возвращают результат определённого типа, а промежуточные операции возвращают тот же
![Потоки Конечные операции возвращают результат определённого типа, а промежуточные операции возвращают тот](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1046761/slide-19.jpg)
поток.
Таким образом вы можете строить цепочки из несколько операций над одним и тем же потоком.
Слайд 21Потоки
Поток создаются на основе источников, например типов, реализующих java.util.Collection, такие как списки
![Потоки Поток создаются на основе источников, например типов, реализующих java.util.Collection, такие как](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1046761/slide-20.jpg)
или множества (ассоциативные массивы не поддерживаются). Операции над потоками могут выполняться как последовательно, так и параллельно.
Слайд 22Filter
Операция Filter принимает предикат, который фильтрует все элементы потока. Эта операция является
![Filter Операция Filter принимает предикат, который фильтрует все элементы потока. Эта операция](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1046761/slide-21.jpg)
промежуточной, т.е. позволяет нам вызвать другую операцию (например, forEach) над результатом. ForEach принимает функцию, которая вызывается для каждого элемента в (уже отфильтрованном) поток.
Слайд 23Sorted
Операция Sorted является промежуточной операцией, которая возвращает отсортированное представление потока. Элементы сортируются
![Sorted Операция Sorted является промежуточной операцией, которая возвращает отсортированное представление потока. Элементы](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1046761/slide-22.jpg)
в обычном порядке, если вы не предоставили свой компаратор.
Помните, что sorted создаёт всего лишь отсортированное представление и не влияет на порядок элементов в исходной коллекции.
Слайд 24Map
Промежуточная операция map преобразовывает каждый элемент в другой объект при помощи переданной
![Map Промежуточная операция map преобразовывает каждый элемент в другой объект при помощи переданной функции.](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1046761/slide-23.jpg)
функции.
Слайд 25Match
Для проверки, удовлетворяет ли поток заданному предикату, используются различные операции сопоставления (match).
![Match Для проверки, удовлетворяет ли поток заданному предикату, используются различные операции сопоставления](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1046761/slide-24.jpg)
Все операции сопоставления являются конечными и возвращают результат типа boolean.
Слайд 26Count
Операция Count является конечной операцией и возвращает количество элементов в потоке. Типом
![Count Операция Count является конечной операцией и возвращает количество элементов в потоке.](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1046761/slide-25.jpg)
возвращаемого значения является long.
Слайд 27Reduce
Эта конечная операция производит свертку элементов потока по заданной функции. Результатом является
![Reduce Эта конечная операция производит свертку элементов потока по заданной функции. Результатом является опциональное значение.](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1046761/slide-26.jpg)
опциональное значение.