Date post: | 15-Jul-2015 |
Category: |
Software |
Upload: | nakraynikov-oleg |
View: | 160 times |
Download: | 5 times |
Назначение 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/]
Спасибо за внимание!