SlideShare a Scribd company logo
Накрайников Олег
uchonyy@gmail.com
Java 8. Innovations
Java. The well-known and not well-known
Java8. Innovations
Java8. Innovations
Назначение lambda-выражений
Java 7
Java 8
Синтаксис lambda-выражений
▪ (String s) -> { return s. length();}
▪ (s) -> { return s. length();}
▪ (s) -> s. length()
▪ s -> s. length()
▪ () -> System.gc();
( Lambda Parameters ) -> { Lambda Body }
Пример:
▪ (int x, int y) -> x+y
▪ (x, y) -> x+y
▪ (int... x) -> x[0]+1
▪ (int[] x) -> x[0]+1
But illegal:
▪ (x, int y) -> x+y
▪ (x, final y) -> x+y
Функциональные интерфейсы
▪ Интерфейс с единственным абстрактным методом
▪ Аннотация @FunctionalInterface не обязательна
Примеры стандартных
функциональных интерфейсов
Функциональный
интерфейс
Типы параметров Возвращаемый тип Имя абстрактного
метода
Runnable Отсутствует Void run
Supplier<T> Отсутствует T get
Consumer<T> T Void accept
BiConsumer<T, U> T, U Void accept
Function<T, R> T R apply
BiFunction<T,U, R> T, U R apply
UnaryOperator<T> T T apply
BinaryOperator<T> T, T T apply
Predicate<T> T Boolean test
BiPredicate<T,U> T,U Boolean test
Примеры стандартных
функциональных интерфейсов
для примитивов
Функциональный
интерфейс
Типы параметров Возвращаемый тип Имя абстрактного
метода
LongFunction<T> long T apply
LongToIntFunction long int apply
ToLongFunction<T> T long apply
Ссылки на методы
▪ объект :: метод экземпляра
▪ класс :: статический метод
▪ класс :: метод экземпляра
В том числе:
▪ this :: метод экземпляра
▪ super :: метод экземпляра
▪ класс:: new
Область действия переменных
▪ Кодовый блок
▪ Параметры
Lambda выражение категории noncapturing :
▪ Кодовый блок
▪ Параметры
▪ Значение свободных
переменных
Lambda выражение категории capturing :
Область действия переменных
Java 7. Final Java 8. Effectively final
Invokedynamic
Первый вызов: Последующие вызовы:
invokedynamic
BootStrap метод
CallSite
MethodHandle
public Object foo(..){…}
вызывает
возвращает
Указывающий на
invokedynamic
CallSite
MethodHandle
public Object foo(..){…}
Извлекае MH из
Указывающий на
или сразу
вызывает
метод
напрямую
Invokedynamic
Пример:
Printer p = System.out::println;
p.print("Str");
MethodHandle
Хранит указатель на метод
CallSite
Объект,
описывающий
«место» вызова в
коде
Default и Static методы
Java8. Innovations
Stream
Java 7 Java 8
Spliterator vs Iterator
Spliterator:
Iterator: 1 2 3 4 5 6
1
2
3
4
6
5
1
2
7 8
7
8
1
2
3
4
5
6
7
8
5
6
7
8
3
4
Stream и Parallel stream
Parallel stream :
Stream: 1 2 3 4 5 6
1
2
3
4
6
5
1
2
7 8
7
8
1
2
3
4
5
6
7
8
5
6
7
8
3
4
Thread 1
Thread 3
Thread 2
Thread 4
Создание Stream
▪ Collection.stream()
▪ Collection.parallelStream()
▪ Stream.of(T …)
▪ Stream.generate(Supplier<T>),
▪ Stream.iterate(T , UnaryOperator<T> )
▪ Arrays.stream(…)
Методы Stream
Метод Назначение
forech(Consumer<? super T>) Передает значение
filter(Predicate<? super T>) Фильтровать по указанному предикату
map(Function<? super T, ? extends R>) Преобразовать значение
flatMap(Function<? super T, ? extends Stream<?
extends R>)
Преобразовать значение в stream
sorted(), sorted(Comparator<? super T>) Сортировать
limit(long) Ограничить количество
count() Число элементов
min(Comparator<? super T> ), max(Comparator<?
super T>)
Найти минимум / максимум
findFirst(), findAny() Получить первый / произвольный элемент
Reduce
Collect
Collectors
Метод Сборщик
toList() В список
toMap(Function<? super T, ? extends K>,
Function<? super T, ? extends U>)
В карту
toSet() В множество
toCollection(Supplier<C>) В коллекцию
groupingBy(Function<? super T, ? extends K> ) Сгруппировать
partitioningBy(Predicate<? super T>) Разбить на две группы по условию
Joining(), Joining(String), Joining(String, String,
String)
Объединить в строку
Optional<T>
Optional<T>
Метод Назначение
ifPresent(Consumer<? super T>); Если представлено – передать
filter(Predicate<? super T>) Фильтровать по условию
map(Function<? super T, ? extends U>) Преобразовать
flatMap(Function<? super T,
Optional<U>>)
Преобразовать в Optional
get() Получить значение
isPresent() Представлено ли?
orElse(T) Получить, или вернуть переданное
значение
Java8. Innovations
Пример с JavaOne 2008
С 1900 года Декабрь = 11
Отсутствует конструктор
с Date
Необходимпривести к
Date
Временная шкала
Местные даты и время
Корректоры дат
Метод Корректор
next(weekday), previous(weekday)
nextOrSame(weekday), previousOrSame (weekday)
Следующая и предыдущая дата приходящаяся на
указанный день недели
dayOfWeekInMonth(n, weekday) Вернет n-ый день недели в месяце
lastInMonth(weekday) Вернет последний день недели в месяце
firstDayOfMonth(), lastDayOfMonth()
firstDayOfNextMonth(), lastDayOfNextMonth(),
firstDayOfNextYear(), lastDayOfNextYear()
Первый или последний день, описанную в названии
метода
Поясное время
Форматирование и парсинг
Взаимодействие с устаревшим кодом
java.util.Date Instant
java.util.Gregorian
Calendar
java.sql.Date
ZonedDateTime
LocalDate
toInstant()
Date.from(instant)
toZonedDateTime()
GregorianCalendar.from(zdt)
toLocalDate()
Date.valueOf(ld)
Дата и время и Instantx
Использованные источники
▪ Кей С. Хорстманн – Java SE 8. Вводный курс
▪ JLS - Lambda Expressions
[http://docs.oracle.com/javase/specs/jls/se8/html/ ]
▪ Translation of Lambda Expressions
[http://cr.openjdk.java.net/~briangoetz/lambda/lambda-
translation.html ]
▪ Дмитрий Козорез — Java 8 Time API
[https://www.youtube.com/watch?v=vBiiU6sNGL0]
▪ Д. Сосноски - Изменения в языке Java 8
[http://www.ibm.com/developerworks/ru/library/j-
java8lambdas/]
Спасибо за внимание!

More Related Content

PPTX
Java 8. Lambdas
PDF
Функционально декларативный дизайн на C++
PDF
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
PDF
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
PDF
Монады для барабанщиков. Антон Холомьёв
PDF
A System of Deductive Verification of Predicate Programs
PPTX
C++ осень 2012 лекция 11
PDF
Лекция о языке программирования Haskell
Java 8. Lambdas
Функционально декларативный дизайн на C++
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Монады для барабанщиков. Антон Холомьёв
A System of Deductive Verification of Predicate Programs
C++ осень 2012 лекция 11
Лекция о языке программирования Haskell

What's hot (20)

PDF
Лекция 4. Стеки и очереди
PDF
Лекция 4: Стек. Очередь
PDF
Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...
PDF
Олег Алистратов — Сортировка списков в Perl и Python
PPTX
PHP7 - что ожидать?
PDF
ITMO RecSys course. Autumn 2014. Lecture 3
PPTX
Урок 8. Введение в редукцию графов
PDF
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
PDF
msumobi2. Лекция 1
PDF
Python. Объектно-ориентированное программирование
PDF
Лекция 4: Стеки и очереди
PDF
Лекция 3: Бинарный поиск. Связные списки
PDF
4.2 Перегрузка
PDF
PDF
PPTX
Программирование: от сложного к простому
PDF
Python&Printer / Андрей Пучко / penta.by
PDF
Основы языка Питон: типы данных, операторы
PPT
ФИЛП
PDF
TMPA-2013 Dmitry Zaitsev
Лекция 4. Стеки и очереди
Лекция 4: Стек. Очередь
Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...
Олег Алистратов — Сортировка списков в Perl и Python
PHP7 - что ожидать?
ITMO RecSys course. Autumn 2014. Lecture 3
Урок 8. Введение в редукцию графов
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
msumobi2. Лекция 1
Python. Объектно-ориентированное программирование
Лекция 4: Стеки и очереди
Лекция 3: Бинарный поиск. Связные списки
4.2 Перегрузка
Программирование: от сложного к простому
Python&Printer / Андрей Пучко / penta.by
Основы языка Питон: типы данных, операторы
ФИЛП
TMPA-2013 Dmitry Zaitsev
Ad

Similar to Java8. Innovations (20)

PPTX
Stream API: рекомендации лучших собаководов
PDF
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
PPTX
DSLs in Lisp and Clojure
PDF
8 встреча — Язык программирования Python (В. Ананьев)
ODP
Charming python sc2-8
PPTX
Расширение библиотеки Slick
PDF
Мир Python функционалим с помощью библиотек
PDF
Clojure #2 (2014)
PDF
Идиоматичный функциональный код
PPTX
Зачем нужна Scala?
PPTX
разработка серверов и серверных приложений лекция №3
PPTX
разработка серверов и серверных приложений лекция №3
PDF
Java 8 puzzlers
PPT
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
PDF
Как приручить дракона: введение в LLVM
PDF
Tech Talks @NSU: Как приручить дракона: введение в LLVM
PDF
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
PPTX
Clojure: Lisp for the modern world (русская версия)
PDF
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
PPTX
стандартная библиотека с++: введение
Stream API: рекомендации лучших собаководов
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
DSLs in Lisp and Clojure
8 встреча — Язык программирования Python (В. Ананьев)
Charming python sc2-8
Расширение библиотеки Slick
Мир Python функционалим с помощью библиотек
Clojure #2 (2014)
Идиоматичный функциональный код
Зачем нужна Scala?
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3
Java 8 puzzlers
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Clojure: Lisp for the modern world (русская версия)
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
стандартная библиотека с++: введение
Ad

More from Nakraynikov Oleg (6)

PPTX
Spring 4. Part 1 - IoC, AOP
PPTX
Java threads - part 3
PPTX
Java threads - part 2
PPTX
Java threads - part 1
PPTX
JavaFX technology
PPTX
Java 8. Thread pools
Spring 4. Part 1 - IoC, AOP
Java threads - part 3
Java threads - part 2
Java threads - part 1
JavaFX technology
Java 8. Thread pools

Java8. Innovations