Download - Java8. Innovations
![Page 2: Java8. Innovations](https://reader030.vdocument.in/reader030/viewer/2022020116/55a663d81a28ab1e0e8b4631/html5/thumbnails/2.jpg)
![Page 3: Java8. Innovations](https://reader030.vdocument.in/reader030/viewer/2022020116/55a663d81a28ab1e0e8b4631/html5/thumbnails/3.jpg)
![Page 4: Java8. Innovations](https://reader030.vdocument.in/reader030/viewer/2022020116/55a663d81a28ab1e0e8b4631/html5/thumbnails/4.jpg)
Назначение lambda-выражений
Java 7
Java 8
![Page 5: Java8. Innovations](https://reader030.vdocument.in/reader030/viewer/2022020116/55a663d81a28ab1e0e8b4631/html5/thumbnails/5.jpg)
Синтаксис 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
![Page 6: Java8. Innovations](https://reader030.vdocument.in/reader030/viewer/2022020116/55a663d81a28ab1e0e8b4631/html5/thumbnails/6.jpg)
Функциональные интерфейсы
▪ Интерфейс с единственным абстрактным методом
▪ Аннотация @FunctionalInterface не обязательна
![Page 7: Java8. Innovations](https://reader030.vdocument.in/reader030/viewer/2022020116/55a663d81a28ab1e0e8b4631/html5/thumbnails/7.jpg)
Примеры стандартных функциональных интерфейсов
Функциональныйинтерфейс
Типы параметров Возвращаемый тип Имя абстрактногометода
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
![Page 8: Java8. Innovations](https://reader030.vdocument.in/reader030/viewer/2022020116/55a663d81a28ab1e0e8b4631/html5/thumbnails/8.jpg)
Примеры стандартных функциональных интерфейсовдля примитивов
Функциональныйинтерфейс
Типы параметров Возвращаемый тип Имя абстрактногометода
LongFunction<T> long T apply
LongToIntFunction long int apply
ToLongFunction<T> T long apply
![Page 9: Java8. Innovations](https://reader030.vdocument.in/reader030/viewer/2022020116/55a663d81a28ab1e0e8b4631/html5/thumbnails/9.jpg)
Ссылки на методы
▪ объект :: метод экземпляра
▪ класс :: статический метод
▪ класс :: метод экземпляра
В том числе:
▪ this :: метод экземпляра
▪ super :: метод экземпляра
▪ класс:: new
![Page 10: Java8. Innovations](https://reader030.vdocument.in/reader030/viewer/2022020116/55a663d81a28ab1e0e8b4631/html5/thumbnails/10.jpg)
Область действия переменных
▪ Кодовый блок
▪ Параметры
Lambda выражение категории noncapturing :
▪ Кодовый блок
▪ Параметры
▪ Значение свободных переменных
Lambda выражение категории capturing :
![Page 11: Java8. Innovations](https://reader030.vdocument.in/reader030/viewer/2022020116/55a663d81a28ab1e0e8b4631/html5/thumbnails/11.jpg)
Область действия переменных
Java 7. Final Java 8. Effectively final
![Page 12: Java8. Innovations](https://reader030.vdocument.in/reader030/viewer/2022020116/55a663d81a28ab1e0e8b4631/html5/thumbnails/12.jpg)
Invokedynamic
Первый вызов: Последующие вызовы:
invokedynamic
BootStrap метод
CallSite
MethodHandlepublic Object foo(..){…}
вызывает
возвращает
Указывающий на
invokedynamic
CallSite
MethodHandlepublic Object foo(..){…}
Извлекае MH из
Указывающий на
или сразувызывает
метод напрямую
![Page 13: Java8. Innovations](https://reader030.vdocument.in/reader030/viewer/2022020116/55a663d81a28ab1e0e8b4631/html5/thumbnails/13.jpg)
Invokedynamic
Пример:
Printer p = System.out::println;p.print("Str");
MethodHandleХранит указатель на метод
CallSiteОбъект,
описывающий«место» вызова в
коде
![Page 14: Java8. Innovations](https://reader030.vdocument.in/reader030/viewer/2022020116/55a663d81a28ab1e0e8b4631/html5/thumbnails/14.jpg)
Default и Static методы
![Page 15: Java8. Innovations](https://reader030.vdocument.in/reader030/viewer/2022020116/55a663d81a28ab1e0e8b4631/html5/thumbnails/15.jpg)
![Page 16: Java8. Innovations](https://reader030.vdocument.in/reader030/viewer/2022020116/55a663d81a28ab1e0e8b4631/html5/thumbnails/16.jpg)
Stream
Java 7 Java 8
![Page 17: Java8. Innovations](https://reader030.vdocument.in/reader030/viewer/2022020116/55a663d81a28ab1e0e8b4631/html5/thumbnails/17.jpg)
Spliterator vs Iterator
Spliterator:
Iterator: 1 2 3 4 5 6
1234
65
12
7 8
78
1234
5678
56
78
34
![Page 18: Java8. Innovations](https://reader030.vdocument.in/reader030/viewer/2022020116/55a663d81a28ab1e0e8b4631/html5/thumbnails/18.jpg)
Stream и Parallel stream
Parallel stream :
Stream: 1 2 3 4 5 6
1234
65
12
7 8
78
1234
5678
56
78
34
Thread 1
Thread 3
Thread 2
Thread 4
![Page 19: Java8. Innovations](https://reader030.vdocument.in/reader030/viewer/2022020116/55a663d81a28ab1e0e8b4631/html5/thumbnails/19.jpg)
Создание Stream
▪ Collection.stream()
▪ Collection.parallelStream()
▪ Stream.of(T …)
▪ Stream.generate(Supplier<T>),
▪ Stream.iterate(T , UnaryOperator<T> )
▪ Arrays.stream(…)
![Page 20: Java8. Innovations](https://reader030.vdocument.in/reader030/viewer/2022020116/55a663d81a28ab1e0e8b4631/html5/thumbnails/20.jpg)
Методы 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() Получить первый / произвольный элемент
![Page 21: Java8. Innovations](https://reader030.vdocument.in/reader030/viewer/2022020116/55a663d81a28ab1e0e8b4631/html5/thumbnails/21.jpg)
Reduce
![Page 22: Java8. Innovations](https://reader030.vdocument.in/reader030/viewer/2022020116/55a663d81a28ab1e0e8b4631/html5/thumbnails/22.jpg)
Collect
![Page 23: Java8. Innovations](https://reader030.vdocument.in/reader030/viewer/2022020116/55a663d81a28ab1e0e8b4631/html5/thumbnails/23.jpg)
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)
Объединить в строку
![Page 24: Java8. Innovations](https://reader030.vdocument.in/reader030/viewer/2022020116/55a663d81a28ab1e0e8b4631/html5/thumbnails/24.jpg)
Optional<T>
![Page 25: Java8. Innovations](https://reader030.vdocument.in/reader030/viewer/2022020116/55a663d81a28ab1e0e8b4631/html5/thumbnails/25.jpg)
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) Получить, или вернуть переданноезначение
![Page 26: Java8. Innovations](https://reader030.vdocument.in/reader030/viewer/2022020116/55a663d81a28ab1e0e8b4631/html5/thumbnails/26.jpg)
![Page 27: Java8. Innovations](https://reader030.vdocument.in/reader030/viewer/2022020116/55a663d81a28ab1e0e8b4631/html5/thumbnails/27.jpg)
Пример с JavaOne 2008
С 1900 года Декабрь = 11
Отсутствует конструкторс Date
Необходимпривести к Date
![Page 28: Java8. Innovations](https://reader030.vdocument.in/reader030/viewer/2022020116/55a663d81a28ab1e0e8b4631/html5/thumbnails/28.jpg)
Временная шкала
![Page 29: Java8. Innovations](https://reader030.vdocument.in/reader030/viewer/2022020116/55a663d81a28ab1e0e8b4631/html5/thumbnails/29.jpg)
Местные даты и время
![Page 30: Java8. Innovations](https://reader030.vdocument.in/reader030/viewer/2022020116/55a663d81a28ab1e0e8b4631/html5/thumbnails/30.jpg)
Корректоры дат
Метод Корректор
next(weekday), previous(weekday)nextOrSame(weekday), previousOrSame (weekday)
Следующая и предыдущая дата приходящаяся на указанный день недели
dayOfWeekInMonth(n, weekday) Вернет n-ый день недели в месяце
lastInMonth(weekday) Вернет последний день недели в месяце
firstDayOfMonth(), lastDayOfMonth()firstDayOfNextMonth(), lastDayOfNextMonth(),firstDayOfNextYear(), lastDayOfNextYear()
Первый или последний день, описанную в названии метода
![Page 31: Java8. Innovations](https://reader030.vdocument.in/reader030/viewer/2022020116/55a663d81a28ab1e0e8b4631/html5/thumbnails/31.jpg)
Поясное время
![Page 32: Java8. Innovations](https://reader030.vdocument.in/reader030/viewer/2022020116/55a663d81a28ab1e0e8b4631/html5/thumbnails/32.jpg)
Форматирование и парсинг
![Page 33: Java8. Innovations](https://reader030.vdocument.in/reader030/viewer/2022020116/55a663d81a28ab1e0e8b4631/html5/thumbnails/33.jpg)
Взаимодействие с устаревшим кодом
java.util.Date Instant
java.util.GregorianCalendar
java.sql.Date
ZonedDateTime
LocalDate
toInstant()
Date.from(instant)
toZonedDateTime()
GregorianCalendar.from(zdt)
toLocalDate()
Date.valueOf(ld)
![Page 34: Java8. Innovations](https://reader030.vdocument.in/reader030/viewer/2022020116/55a663d81a28ab1e0e8b4631/html5/thumbnails/34.jpg)
Дата и время и Instantx
![Page 35: Java8. Innovations](https://reader030.vdocument.in/reader030/viewer/2022020116/55a663d81a28ab1e0e8b4631/html5/thumbnails/35.jpg)
Использованные источники
▪ Кей С. Хорстманн – 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/]
![Page 36: Java8. Innovations](https://reader030.vdocument.in/reader030/viewer/2022020116/55a663d81a28ab1e0e8b4631/html5/thumbnails/36.jpg)
Спасибо за внимание!