SlideShare a Scribd company logo
Накрайников Олег
uchonyy@gmail.com
Java 8. Lambdas
Java. The well-known and not well-known
8
Назначение 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
Область действия переменных
Legal: x и y являются effectively final
void m1(int x) {
int y = 1;
foo(() -> x+y);
}
Legal: x и y являются effectively final
void m2(int x) {
int y;
y = 1;
foo(() -> x+y);
}
Illegal: y являются effectively final, но гарантировано
не инициализирована.
void m3(int x) {
int y;
if (...) y = 1;
foo(() -> x+y);
}
Legal: x и y являются effectively final
void m4(int x) {
int y;
if (...) y = 1; else y = 2;
foo(() ->; x+y);
}
Область действия переменных
Illegal : x не являются effectively final
void m5(int x) {
int y;
if (...) y = 1;
y = 2;
foo(() -> x+y);
}
Illegal: x не являются effectively final
void m6(int x) {
foo(() -> x+1);
x++;
}
Illegal : x не являются effectively final
void m7(int x) {
foo(() -> x=1);
}
Illegal : y не являются effectively final
void m8() {
int y;
foo(() -> y=1);
}
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
Объект,
описывающий
«место» вызова в
коде
Трансляция lambda выражений
Стратегия 1. Lambda выражение категории noncapturing :
Исходный код:
class A {
public void foo() {
List<String> list = ...
list.forEach( s -> {
System.out.println(s);
} );
}
}
Оттранслированый код:
class A {
public void foo() {
List<String> list = ...
list.forEach(
indy((MH(metaFactory),
MH(invokeVirtual Consumer. accepts),
MH(invokeStatic A.lambda$1)( )));
}
private static void lambda$1(String s) {
System.out.println(s);
}
}
Трансляция lambda выражений
Стратегия 2. Lambda выражение категории capturing :
Исходный код:
class B {
public void foo() {
List<String> list = ...
final int bottom = ..., top = ...;
list.removeIf( s ->
(s. length() >= bottom &&
s. length() <= top) );
}
}
Оттранслированый код:
class B {
public void foo() {
List<String> list = ...
final int bottom = ..., top = ...;
list.removeIf(
indy((MH(metaFactory),
MH(invokeVirtual Predicate.apply),
MH(invokeStatic B.lambda$1))( bottom, top )))); }
static boolean lambda$1(int bottom, int top, String s) {
return (p. length() >= bottom && p. length() <= top;
}
}
Трансляция lambda выражений
Стратегия 3. Lambda выражение категории capturing :
Исходный код:
class B {
final int bottom = ..., top = ...;
public void foo() {
List<String> list = ...
list.removeIf( s ->
(s. length() >= bottom &&
s. length() <= top) );
}
}
Оттранслированый код:
class B {
final int bottom = ..., top = ...;
public void foo() {
List<String> list = ...
list.forEach(
INDY((MH(metaFactory),
MH(invokeVirtual Predicate.apply),
MH(invokeVirtual B.lambda$1))( this )))); }
private boolean lambda$1(Element e) {
return e.getSize() < minSize;
}
}
Трансляция lambda выражений
Стратегия 4. Ссылка на метод :
Исходный код:
class A {
public void foo() {
List<String> list = ...
list.filter(String::isEmpty) }
}
Оттранслированый код:
class A {
public void foo() {
List<String> list = ...
list.filter(
indy(MH(metaFactory),
MH(invokeVirtual Predicate.apply),
MH(invokeVirtual String.isEmpty))()))
}
}
Трансляция lambda выражений
Стратегия 5. Аргументы переменной длины:
Исходный код:
interface IIS {
void foo(Integer a1, Integer a2, String a3);
}
class Foo {
static void m(Number a1, Object... rest) { ... }
}
class Bar {
void bar() {
IIS x = Foo::m;
}
}
Оттранслированый код:
class Bar {
void bar() {
SIS x = indy((MH(metafactory), MH(invokeVirtual IIS.foo),
MH(invokeStatic m$bridge))( ))
}
static private void m$bridge(Integer a1, Integer a2,
String a3) {
Foo.m(a1, a2, a3);
}
}
Сериализация lambda выражений
Вариант 1:
Сериализация lambda выражений
Вариант 2:
Использованные источники
▪ Кей С. Хорстманн – 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
]
▪ State of the Lambda
[http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-4.html]
▪ Д. Сосноски - Изменения в языке Java 8
[http://www.ibm.com/developerworks/ru/library/j-java8lambdas/]
Спасибо за внимание!

More Related Content

What's hot

A System of Deductive Verification of Predicate Programs
A System of Deductive Verification of Predicate ProgramsA System of Deductive Verification of Predicate Programs
A System of Deductive Verification of Predicate Programs
Iosif Itkin
 
C++ осень 2012 лекция 11
C++ осень 2012 лекция 11C++ осень 2012 лекция 11
C++ осень 2012 лекция 11Technopark
 
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
corehard_by
 
Haskell
HaskellHaskell
Haskell
DevDay
 
Лекция о языке программирования Haskell
Лекция о языке программирования HaskellЛекция о языке программирования Haskell
Лекция о языке программирования Haskell
husniyarova
 
Лекция 4. Стеки и очереди
Лекция 4. Стеки и очередиЛекция 4. Стеки и очереди
Лекция 4. Стеки и очереди
Mikhail Kurnosov
 
ITMO RecSys course. Autumn 2014. Lecture 3
ITMO RecSys course. Autumn 2014. Lecture 3ITMO RecSys course. Autumn 2014. Lecture 3
ITMO RecSys course. Autumn 2014. Lecture 3
Andrey Danilchenko
 
Олег Алистратов — Сортировка списков в Perl и Python
Олег Алистратов — Сортировка списков в Perl и PythonОлег Алистратов — Сортировка списков в Perl и Python
Олег Алистратов — Сортировка списков в Perl и Python
Yandex
 
Лекция 4: Стек. Очередь
Лекция 4: Стек. ОчередьЛекция 4: Стек. Очередь
Лекция 4: Стек. ОчередьMikhail Kurnosov
 
Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...
Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...
Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...Nikolay Grebenshikov
 
Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11
Yandex
 
PHP7 - что ожидать?
PHP7 - что ожидать?PHP7 - что ожидать?
PHP7 - что ожидать?
Дмитрий Золотов
 
Python. Объектно-ориентированное программирование
Python. Объектно-ориентированное программирование Python. Объектно-ориентированное программирование
Python. Объектно-ориентированное программирование
Theoretical mechanics department
 
msumobi2. Лекция 1
msumobi2. Лекция 1msumobi2. Лекция 1
msumobi2. Лекция 1
Глеб Тарасов
 
4.2 Перегрузка
4.2 Перегрузка4.2 Перегрузка
4.2 Перегрузка
DEVTYPE
 
Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиMikhail Kurnosov
 
Основы NumPy
Основы NumPyОсновы NumPy
Лекция 4: Стеки и очереди
Лекция 4: Стеки и очередиЛекция 4: Стеки и очереди
Лекция 4: Стеки и очередиMikhail Kurnosov
 
Урок 8. Введение в редукцию графов
Урок 8. Введение в редукцию графовУрок 8. Введение в редукцию графов
Урок 8. Введение в редукцию графов
Система дистанционного обучения MyDLS
 
Основы SciPy
Основы SciPyОсновы SciPy

What's hot (20)

A System of Deductive Verification of Predicate Programs
A System of Deductive Verification of Predicate ProgramsA System of Deductive Verification of Predicate Programs
A System of Deductive Verification of Predicate Programs
 
C++ осень 2012 лекция 11
C++ осень 2012 лекция 11C++ осень 2012 лекция 11
C++ осень 2012 лекция 11
 
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
 
Haskell
HaskellHaskell
Haskell
 
Лекция о языке программирования Haskell
Лекция о языке программирования HaskellЛекция о языке программирования Haskell
Лекция о языке программирования Haskell
 
Лекция 4. Стеки и очереди
Лекция 4. Стеки и очередиЛекция 4. Стеки и очереди
Лекция 4. Стеки и очереди
 
ITMO RecSys course. Autumn 2014. Lecture 3
ITMO RecSys course. Autumn 2014. Lecture 3ITMO RecSys course. Autumn 2014. Lecture 3
ITMO RecSys course. Autumn 2014. Lecture 3
 
Олег Алистратов — Сортировка списков в Perl и Python
Олег Алистратов — Сортировка списков в Perl и PythonОлег Алистратов — Сортировка списков в Perl и Python
Олег Алистратов — Сортировка списков в Perl и Python
 
Лекция 4: Стек. Очередь
Лекция 4: Стек. ОчередьЛекция 4: Стек. Очередь
Лекция 4: Стек. Очередь
 
Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...
Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...
Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...
 
Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11
 
PHP7 - что ожидать?
PHP7 - что ожидать?PHP7 - что ожидать?
PHP7 - что ожидать?
 
Python. Объектно-ориентированное программирование
Python. Объектно-ориентированное программирование Python. Объектно-ориентированное программирование
Python. Объектно-ориентированное программирование
 
msumobi2. Лекция 1
msumobi2. Лекция 1msumobi2. Лекция 1
msumobi2. Лекция 1
 
4.2 Перегрузка
4.2 Перегрузка4.2 Перегрузка
4.2 Перегрузка
 
Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные списки
 
Основы NumPy
Основы NumPyОсновы NumPy
Основы NumPy
 
Лекция 4: Стеки и очереди
Лекция 4: Стеки и очередиЛекция 4: Стеки и очереди
Лекция 4: Стеки и очереди
 
Урок 8. Введение в редукцию графов
Урок 8. Введение в редукцию графовУрок 8. Введение в редукцию графов
Урок 8. Введение в редукцию графов
 
Основы SciPy
Основы SciPyОсновы SciPy
Основы SciPy
 

Viewers also liked

Java. Lecture 01. Introducing Java
Java. Lecture 01. Introducing JavaJava. Lecture 01. Introducing Java
Java. Lecture 01. Introducing Javacolriot
 
Open Source - Bзгляд из вражeскoгo лагeря
Open Source - Bзгляд из вражeскoгo лагeряOpen Source - Bзгляд из вражeскoгo лагeря
Open Source - Bзгляд из вражeскoгo лагeря
Andrew Zaikin
 
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
CocoaHeads
 
20 most important java programming interview questions
20 most important java programming interview questions20 most important java programming interview questions
20 most important java programming interview questions
Gradeup
 
Batching and Java EE (jdk.io)
Batching and Java EE (jdk.io)Batching and Java EE (jdk.io)
Batching and Java EE (jdk.io)
Ryan Cuprak
 
Date & Time in Java SE 8
Date & Time in Java SE 8Date & Time in Java SE 8
Date & Time in Java SE 8
Ilya Lapitan
 
Մաթեմատիկա
ՄաթեմատիկաՄաթեմատիկա
Մաթեմատիկա
G-College
 
դաս մաթեմատիկա Հասմիկ Ավետիքյան
դաս մաթեմատիկա Հասմիկ Ավետիքյանդաս մաթեմատիկա Հասմիկ Ավետիքյան
դաս մաթեմատիկա Հասմիկ Ավետիքյանwww.mskh.am
 
մաթեմատիկա 4 րդ դասարան
մաթեմատիկա 4 րդ դասարանմաթեմատիկա 4 րդ դասարան
մաթեմատիկա 4 րդ դասարանnordprocmskh
 
Top 50 java ee 7 best practices [con5669]
Top 50 java ee 7 best practices [con5669]Top 50 java ee 7 best practices [con5669]
Top 50 java ee 7 best practices [con5669]
Ryan Cuprak
 
Բաց դաս
Բաց դասԲաց դաս
Բաց դաս
Manushakch
 
Spring 4. Part 1 - IoC, AOP
Spring 4. Part 1 - IoC, AOPSpring 4. Part 1 - IoC, AOP
Spring 4. Part 1 - IoC, AOP
Nakraynikov Oleg
 
Դասի պլան
Դասի պլանԴասի պլան
Դասի պլան
Ohanyan Educational Complex
 

Viewers also liked (16)

Java. Lecture 01. Introducing Java
Java. Lecture 01. Introducing JavaJava. Lecture 01. Introducing Java
Java. Lecture 01. Introducing Java
 
Open Source - Bзгляд из вражeскoгo лагeря
Open Source - Bзгляд из вражeскoгo лагeряOpen Source - Bзгляд из вражeскoгo лагeря
Open Source - Bзгляд из вражeскoгo лагeря
 
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
 
20 most important java programming interview questions
20 most important java programming interview questions20 most important java programming interview questions
20 most important java programming interview questions
 
Batching and Java EE (jdk.io)
Batching and Java EE (jdk.io)Batching and Java EE (jdk.io)
Batching and Java EE (jdk.io)
 
Date & Time in Java SE 8
Date & Time in Java SE 8Date & Time in Java SE 8
Date & Time in Java SE 8
 
մեթոդ և հնար
մեթոդ և հնարմեթոդ և հնար
մեթոդ և հնար
 
Մաթեմատիկա
ՄաթեմատիկաՄաթեմատիկա
Մաթեմատիկա
 
դաս մաթեմատիկա Հասմիկ Ավետիքյան
դաս մաթեմատիկա Հասմիկ Ավետիքյանդաս մաթեմատիկա Հասմիկ Ավետիքյան
դաս մաթեմատիկա Հասմիկ Ավետիքյան
 
մաթեմատիկա 4 րդ դասարան
մաթեմատիկա 4 րդ դասարանմաթեմատիկա 4 րդ դասարան
մաթեմատիկա 4 րդ դասարան
 
ուսուցման մեթոդներ
ուսուցման մեթոդներուսուցման մեթոդներ
ուսուցման մեթոդներ
 
Top 50 java ee 7 best practices [con5669]
Top 50 java ee 7 best practices [con5669]Top 50 java ee 7 best practices [con5669]
Top 50 java ee 7 best practices [con5669]
 
դասվար թեմատիկ պլան
դասվար թեմատիկ պլանդասվար թեմատիկ պլան
դասվար թեմատիկ պլան
 
Բաց դաս
Բաց դասԲաց դաս
Բաց դաս
 
Spring 4. Part 1 - IoC, AOP
Spring 4. Part 1 - IoC, AOPSpring 4. Part 1 - IoC, AOP
Spring 4. Part 1 - IoC, AOP
 
Դասի պլան
Դասի պլանԴասի պլան
Դասի պլան
 

Similar to Java 8. Lambdas

8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)
Smolensk Computer Science Club
 
Charming python sc2-8
Charming python sc2-8Charming python sc2-8
Charming python sc2-8
Vladislav Ananev
 
Характерные черты функциональных языков программирования
Характерные черты функциональных языков программированияХарактерные черты функциональных языков программирования
Характерные черты функциональных языков программированияAlex.Kolonitsky
 
Scala #3
Scala #3Scala #3
Haskell Type System with Dzmitry Ivashnev.
Haskell Type System with Dzmitry Ivashnev.Haskell Type System with Dzmitry Ivashnev.
Haskell Type System with Dzmitry Ivashnev.
Sergey Tihon
 
C# Deep Dive
C# Deep DiveC# Deep Dive
C# Deep Dive
LuxoftTraining
 
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стиль
Python Meetup
 
Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"
Fwdays
 
Scala on android
Scala on androidScala on android
Scala on android
Valeriya Atamanova
 
Discovering Lambdas in Java 8
Discovering Lambdas in Java 8Discovering Lambdas in Java 8
Discovering Lambdas in Java 8
Stfalcon Meetups
 
Функции, 11-й клаас
Функции, 11-й клаасФункции, 11-й клаас
Функции, 11-й клаасAlbina
 
Основы Python. Функции
Основы Python. ФункцииОсновы Python. Функции
Основы Python. Функции
Theoretical mechanics department
 
Евгений Котельников. Зависимые типы в Haskell
Евгений Котельников. Зависимые типы в HaskellЕвгений Котельников. Зависимые типы в Haskell
Евгений Котельников. Зависимые типы в Haskell
FProg
 
Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)Dmitry Stropalov
 
кустурова элем функции
кустурова элем функциикустурова элем функции
кустурова элем функцииurvlan
 
Groovy и Grails. Быстро и обо всём
Groovy и Grails. Быстро и обо всёмGroovy и Grails. Быстро и обо всём
Groovy и Grails. Быстро и обо всём
Ruslan Balkin
 
Rust: абстракции и безопасность, совершенно бесплатно
Rust: абстракции и безопасность, совершенно бесплатноRust: абстракции и безопасность, совершенно бесплатно
Rust: абстракции и безопасность, совершенно бесплатно
Open-IT
 

Similar to Java 8. Lambdas (20)

8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)
 
Charming python sc2-8
Charming python sc2-8Charming python sc2-8
Charming python sc2-8
 
Характерные черты функциональных языков программирования
Характерные черты функциональных языков программированияХарактерные черты функциональных языков программирования
Характерные черты функциональных языков программирования
 
Scala #3
Scala #3Scala #3
Scala #3
 
Haskell Type System with Dzmitry Ivashnev.
Haskell Type System with Dzmitry Ivashnev.Haskell Type System with Dzmitry Ivashnev.
Haskell Type System with Dzmitry Ivashnev.
 
C sharp deep dive
C sharp deep diveC sharp deep dive
C sharp deep dive
 
C# Deep Dive
C# Deep DiveC# Deep Dive
C# Deep Dive
 
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стиль
 
Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"
 
Scala on android
Scala on androidScala on android
Scala on android
 
Discovering Lambdas in Java 8
Discovering Lambdas in Java 8Discovering Lambdas in Java 8
Discovering Lambdas in Java 8
 
Scala
ScalaScala
Scala
 
Функции, 11-й клаас
Функции, 11-й клаасФункции, 11-й клаас
Функции, 11-й клаас
 
Основы Python. Функции
Основы Python. ФункцииОсновы Python. Функции
Основы Python. Функции
 
Bytecode
BytecodeBytecode
Bytecode
 
Евгений Котельников. Зависимые типы в Haskell
Евгений Котельников. Зависимые типы в HaskellЕвгений Котельников. Зависимые типы в Haskell
Евгений Котельников. Зависимые типы в Haskell
 
Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)
 
кустурова элем функции
кустурова элем функциикустурова элем функции
кустурова элем функции
 
Groovy и Grails. Быстро и обо всём
Groovy и Grails. Быстро и обо всёмGroovy и Grails. Быстро и обо всём
Groovy и Grails. Быстро и обо всём
 
Rust: абстракции и безопасность, совершенно бесплатно
Rust: абстракции и безопасность, совершенно бесплатноRust: абстракции и безопасность, совершенно бесплатно
Rust: абстракции и безопасность, совершенно бесплатно
 

Java 8. Lambdas

  • 1. Накрайников Олег uchonyy@gmail.com Java 8. Lambdas Java. The well-known and not well-known
  • 2. 8
  • 4. Синтаксис 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
  • 5. Функциональные интерфейсы ▪ Интерфейс с единственным абстрактным методом ▪ Аннотация @FunctionalInterface не обязательна
  • 6. Примеры стандартных функциональных интерфейсов Функциональный интерфейс Типы параметров Возвращаемый тип Имя абстрактного метода 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
  • 7. Примеры стандартных функциональных интерфейсов для примитивов Функциональный интерфейс Типы параметров Возвращаемый тип Имя абстрактного метода LongFunction<T> long T apply LongToIntFunction long int apply ToLongFunction<T> T long apply
  • 8. Ссылки на методы ▪ объект :: метод экземпляра ▪ класс :: статический метод ▪ класс :: метод экземпляра В том числе: ▪ this :: метод экземпляра ▪ super :: метод экземпляра ▪ класс:: new
  • 9. Область действия переменных ▪ Кодовый блок ▪ Параметры Lambda выражение категории noncapturing : ▪ Кодовый блок ▪ Параметры ▪ Значение свободных переменных Lambda выражение категории capturing :
  • 10. Область действия переменных Java 7. Final Java 8. Effectively final
  • 11. Область действия переменных Legal: x и y являются effectively final void m1(int x) { int y = 1; foo(() -> x+y); } Legal: x и y являются effectively final void m2(int x) { int y; y = 1; foo(() -> x+y); } Illegal: y являются effectively final, но гарантировано не инициализирована. void m3(int x) { int y; if (...) y = 1; foo(() -> x+y); } Legal: x и y являются effectively final void m4(int x) { int y; if (...) y = 1; else y = 2; foo(() ->; x+y); }
  • 12. Область действия переменных Illegal : x не являются effectively final void m5(int x) { int y; if (...) y = 1; y = 2; foo(() -> x+y); } Illegal: x не являются effectively final void m6(int x) { foo(() -> x+1); x++; } Illegal : x не являются effectively final void m7(int x) { foo(() -> x=1); } Illegal : y не являются effectively final void m8() { int y; foo(() -> y=1); }
  • 13. Invokedynamic Первый вызов: Последующие вызовы: invokedynamic BootStrap метод CallSite MethodHandle public Object foo(..){…} вызывает возвращает Указывающий на invokedynamic CallSite MethodHandle public Object foo(..){…} Извлекае MH из Указывающий на или сразу вызывает метод напрямую
  • 14. Invokedynamic Пример: Printer p = System.out::println; p.print("Str"); MethodHandle Хранит указатель на метод CallSite Объект, описывающий «место» вызова в коде
  • 15. Трансляция lambda выражений Стратегия 1. Lambda выражение категории noncapturing : Исходный код: class A { public void foo() { List<String> list = ... list.forEach( s -> { System.out.println(s); } ); } } Оттранслированый код: class A { public void foo() { List<String> list = ... list.forEach( indy((MH(metaFactory), MH(invokeVirtual Consumer. accepts), MH(invokeStatic A.lambda$1)( ))); } private static void lambda$1(String s) { System.out.println(s); } }
  • 16. Трансляция lambda выражений Стратегия 2. Lambda выражение категории capturing : Исходный код: class B { public void foo() { List<String> list = ... final int bottom = ..., top = ...; list.removeIf( s -> (s. length() >= bottom && s. length() <= top) ); } } Оттранслированый код: class B { public void foo() { List<String> list = ... final int bottom = ..., top = ...; list.removeIf( indy((MH(metaFactory), MH(invokeVirtual Predicate.apply), MH(invokeStatic B.lambda$1))( bottom, top )))); } static boolean lambda$1(int bottom, int top, String s) { return (p. length() >= bottom && p. length() <= top; } }
  • 17. Трансляция lambda выражений Стратегия 3. Lambda выражение категории capturing : Исходный код: class B { final int bottom = ..., top = ...; public void foo() { List<String> list = ... list.removeIf( s -> (s. length() >= bottom && s. length() <= top) ); } } Оттранслированый код: class B { final int bottom = ..., top = ...; public void foo() { List<String> list = ... list.forEach( INDY((MH(metaFactory), MH(invokeVirtual Predicate.apply), MH(invokeVirtual B.lambda$1))( this )))); } private boolean lambda$1(Element e) { return e.getSize() < minSize; } }
  • 18. Трансляция lambda выражений Стратегия 4. Ссылка на метод : Исходный код: class A { public void foo() { List<String> list = ... list.filter(String::isEmpty) } } Оттранслированый код: class A { public void foo() { List<String> list = ... list.filter( indy(MH(metaFactory), MH(invokeVirtual Predicate.apply), MH(invokeVirtual String.isEmpty))())) } }
  • 19. Трансляция lambda выражений Стратегия 5. Аргументы переменной длины: Исходный код: interface IIS { void foo(Integer a1, Integer a2, String a3); } class Foo { static void m(Number a1, Object... rest) { ... } } class Bar { void bar() { IIS x = Foo::m; } } Оттранслированый код: class Bar { void bar() { SIS x = indy((MH(metafactory), MH(invokeVirtual IIS.foo), MH(invokeStatic m$bridge))( )) } static private void m$bridge(Integer a1, Integer a2, String a3) { Foo.m(a1, a2, a3); } }
  • 22. Использованные источники ▪ Кей С. Хорстманн – 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 ] ▪ State of the Lambda [http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-4.html] ▪ Д. Сосноски - Изменения в языке Java 8 [http://www.ibm.com/developerworks/ru/library/j-java8lambdas/]