Java8. Innovations

36
Накрайников Олег [email protected] Java 8. Innovations Java. The well-known and not well-known

Transcript of Java8. Innovations

Page 1: Java8. Innovations

Накрайников Олег[email protected]

Java 8. Innovations

Java. The well-known and not well-known

Page 2: Java8. Innovations
Page 3: Java8. Innovations
Page 4: Java8. Innovations

Назначение lambda-выражений

Java 7

Java 8

Page 5: Java8. Innovations

Синтаксис 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

Функциональные интерфейсы

▪ Интерфейс с единственным абстрактным методом

▪ Аннотация @FunctionalInterface не обязательна

Page 7: Java8. Innovations

Примеры стандартных функциональных интерфейсов

Функциональныйинтерфейс

Типы параметров Возвращаемый тип Имя абстрактногометода

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

Примеры стандартных функциональных интерфейсовдля примитивов

Функциональныйинтерфейс

Типы параметров Возвращаемый тип Имя абстрактногометода

LongFunction<T> long T apply

LongToIntFunction long int apply

ToLongFunction<T> T long apply

Page 9: Java8. Innovations

Ссылки на методы

▪ объект :: метод экземпляра

▪ класс :: статический метод

▪ класс :: метод экземпляра

В том числе:

▪ this :: метод экземпляра

▪ super :: метод экземпляра

▪ класс:: new

Page 10: Java8. Innovations

Область действия переменных

▪ Кодовый блок

▪ Параметры

Lambda выражение категории noncapturing :

▪ Кодовый блок

▪ Параметры

▪ Значение свободных переменных

Lambda выражение категории capturing :

Page 11: Java8. Innovations

Область действия переменных

Java 7. Final Java 8. Effectively final

Page 12: Java8. Innovations

Invokedynamic

Первый вызов: Последующие вызовы:

invokedynamic

BootStrap метод

CallSite

MethodHandlepublic Object foo(..){…}

вызывает

возвращает

Указывающий на

invokedynamic

CallSite

MethodHandlepublic Object foo(..){…}

Извлекае MH из

Указывающий на

или сразувызывает

метод напрямую

Page 13: Java8. Innovations

Invokedynamic

Пример:

Printer p = System.out::println;p.print("Str");

MethodHandleХранит указатель на метод

CallSiteОбъект,

описывающий«место» вызова в

коде

Page 14: Java8. Innovations

Default и Static методы

Page 15: Java8. Innovations
Page 16: Java8. Innovations

Stream

Java 7 Java 8

Page 17: Java8. Innovations

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

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

Создание Stream

▪ Collection.stream()

▪ Collection.parallelStream()

▪ Stream.of(T …)

▪ Stream.generate(Supplier<T>),

▪ Stream.iterate(T , UnaryOperator<T> )

▪ Arrays.stream(…)

Page 20: Java8. Innovations

Методы 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

Reduce

Page 22: Java8. Innovations

Collect

Page 23: Java8. Innovations

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

Optional<T>

Page 25: Java8. Innovations

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
Page 27: Java8. Innovations

Пример с JavaOne 2008

С 1900 года Декабрь = 11

Отсутствует конструкторс Date

Необходимпривести к Date

Page 28: Java8. Innovations

Временная шкала

Page 29: Java8. Innovations

Местные даты и время

Page 30: Java8. Innovations

Корректоры дат

Метод Корректор

next(weekday), previous(weekday)nextOrSame(weekday), previousOrSame (weekday)

Следующая и предыдущая дата приходящаяся на указанный день недели

dayOfWeekInMonth(n, weekday) Вернет n-ый день недели в месяце

lastInMonth(weekday) Вернет последний день недели в месяце

firstDayOfMonth(), lastDayOfMonth()firstDayOfNextMonth(), lastDayOfNextMonth(),firstDayOfNextYear(), lastDayOfNextYear()

Первый или последний день, описанную в названии метода

Page 31: Java8. Innovations

Поясное время

Page 32: Java8. Innovations

Форматирование и парсинг

Page 33: Java8. Innovations

Взаимодействие с устаревшим кодом

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

Дата и время и Instantx

Page 35: Java8. Innovations

Использованные источники

▪ Кей С. Хорстманн – 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

Спасибо за внимание!