Java8. Innovations

Preview:

Citation preview

Накрайников Олегuchonyy@gmail.com

Java 8. Innovations

Java. The well-known and not well-known

Назначение 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

MethodHandlepublic Object foo(..){…}

вызывает

возвращает

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

invokedynamic

CallSite

MethodHandlepublic Object foo(..){…}

Извлекае MH из

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

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

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

Invokedynamic

Пример:

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

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

CallSiteОбъект,

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

коде

Default и Static методы

Stream

Java 7 Java 8

Spliterator vs Iterator

Spliterator:

Iterator: 1 2 3 4 5 6

1234

65

12

7 8

78

1234

5678

56

78

34

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

Создание 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) Получить, или вернуть переданноезначение

Пример с 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.GregorianCalendar

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/]

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