SlideShare a Scribd company logo
Discovering Lambdas inDiscovering Lambdas in
Java8Java8
by Aleksandra Dmytrenkoby Aleksandra Dmytrenko
ПланПлан
Старая добрая Java -> Функциональное
программирование
Как посчитать факториал?
Слон и моська в одном
Функциональные интерфейсы
ФункциональноеФункциональное
программированипрограммировани
е!е!
Чем ФП приятно?Чем ФП приятно?
Функция не может поменять значение переменной вне
своей видимости, все переменные final (рай для юнит
тестов)
Внешние состояние не влияет на функцию (удобно
отлаживать и замещать части кода).
Встроенная многопоточность (кому нравится думать
про «разделяй и властвуй?»)
Ленивые (отложенные) вычисления - выполняется
только нужный код в момент, когда надо результат.
Чем ФП чревато?Чем ФП чревато?
Состояние не хранится (нет переменных)
Все переменные final или const, нет public (как вам
код с такими ограничениями?)
Встроенная многопоточность (к сожалению пока не
на высшем уровне)
Ленивые (отложенные) вычисления - выполняется
только используемый код в «когда захочу» момент.
Тяжело контролировать очередность действий.
К делуК делу
Как определить,Как определить,
простое ли число?простое ли число?
ЛегкимЛегким
движением рукидвижением руки
императивноеимперативное
программиро-программиро-
ваниевание
превращается впревращается в
декларативноедекларативное
КАК делаем -> ЧТОКАК делаем -> ЧТО
делаем?делаем?
Imperative style:
public boolean isPrime(int number) {
for (int curNumb = 2; curNumb <= number/2; curNumb++) {
if (number % curNumb == 0) {
return false;
}
}
return true;
}
DECLARATIVE STYLE:
public boolean isPrimeDeclarative(final int number) {
return IntStream.rangeClosed(2, number/2)
.noneMatch(curNumb -> number % curNumb == 0);
}
Добавим проверку наДобавим проверку на
знак числазнак числа
public boolean isPrimeImperative(int number) {
if (number < 0) {
return false;
}
for (int curNumb = 2; curNumb <= number / 2; curNumb++) {
if (number % curNumb == 0) {
return false;
}
}
return true;
}
public boolean isPrimeDeclarativeNegativeNumbCheck(final int number) {
return number >= 0 && IntStream.rangeClosed(2, number.2)
.noneMatch(curNumb -> number % curNumb == 0);
}
Ну… надо бы еще наНу… надо бы еще на
что-то посмотретьчто-то посмотреть
Кого на собеседовании неКого на собеседовании не
просили посчитать факториал?просили посчитать факториал?
public static int factorialOf(int number) {
if (number >= 0) {
int factorial = 1;
for (int curNumb = 2; curNumb <= number; curNumb++){
factorial = factorial * curNumber;
}
return factorial;
} else throw new IllegalArgumentException("Factorial can be counted only
of not negative numbers.");
}
6 строчек!
public static int factorialOf(int number) {
if (number > 0) return number*factorialOf(number-1);
if (number == 0) return 1;
else throw new IllegalArgumentException("Factorial can be counted only of not
negative numbers.");
}
3 строчки!
Факториал через цикл каждыйФакториал через цикл каждый
напишет. А рекурсия во чтонапишет. А рекурсия во что
обойдется?обойдется?
public static int factorialOf(int number) {
if (number >= 0)
return IntStream.rangeClosed(2, number)
.reduce(1, (accResult, curNumb) -> accResult * curNumb);
else throw new IllegalArgumentException("Factorial can be counted only of not negative
numbers.");
}
3 строчки!
– Я и многие другие
“Не делайте что-то только потому, что вы
можете это сделать. Делайте красиво.”
Chuck Norris can do multipleChuck Norris can do multiple
inheritance in Javainheritance in Java
Я скажу вамЯ скажу вам
больше, не толькобольше, не только
он может. Вы тоже!он может. Вы тоже!
С помощьюС помощью
интерфейсов,интерфейсов,
правда.правда.
А что если бы Cлон был Моськой, аА что если бы Cлон был Моськой, а
Моська Cлоном?Моська Cлоном?
interface Elephant {
default String makeSound(String name) {
return name + ": Не злите меня!";
}
}
interface Dog {
default String makeSound(String name) {
return name + ": Гав-гав";
}
}
class EveryDogWantsToBeAnElephant implements Dog, Elephant {
@Override
public String makeSound(String name) {
return name + ": Я спокоен";
}
public static void main(final String[] args) {
EveryDogWantsToBeAnElephant elephantDog = new
EveryDogWantsToBeAnElephant();
Elephant e = new Elephant(){};
Dog d = new Dog(){};
System.out.println(e.makeSound("Слон"));
System.out.println(d.makeSound("Моська"));
System.out.println(elephantDog.makeSound("Моська-слон"));
}}
А что если бы Cлон был Моськой, аА что если бы Cлон был Моськой, а
Моська Cлоном?Моська Cлоном?
СлонСлон: Не злите меня!: Не злите меня!
МоськаМоська: Гав-гав: Гав-гав
МоськаМоська--слонслон: Я спокоен: Я спокоен
Множественное наследование - это когда
есть дефолтная реализация метода с
одинаковым названием в каждом
интерфейсе.
А как себя будут вести статические и
абстрактные методы?
Статические методыСтатические методы
К ним мы обращаемся как
НазваниеКласса.имяМетода. По
сути эта комбинация всегда
уникальна и ее можно
воспринимать целиком, как
название
interface Dog {
static String walk() {
return "Я бегаю быстренько своими
маленькими лапками.»;
}}
interface Elephant {
static String walk() {
return "Я большой и ступаю тихо но тяжело.";
}}
——————————————————————
———————————————
System.out.println(Elephant.walk());
System.out.println(Dog.walk());
OUTPUT:
Я большой и ступаю тихо но тяжело.
Я бегаю быстренько своими маленькими
лапками.
Абстрактные методыАбстрактные методы
Когда мы инстанциируем абстрактный класс
(интерфейс), то надо реализовать все абстрактные
методы.
Но если мы имплементируем интерфейсы с
одинаковыми названиями методов, достаточно
описать только один из них.
Пример: Comparator с его int compare(T o1, T o2),
Comparable с его int compareTo(T o)
и другие
Интерфейс, у которого есть только один
абстрактный метод называется
функциональным интерфейсом
1. Можно по-старинке:
Elephant e = new Elephant() {
@Override
public boolean isProud() {
return false;
}
};
2. Можно по-модному:
Elephant e = () -> { return false; };
3. А можно без лишних слов:
Elephant e = () -> false;
Реализуем функциональныйРеализуем функциональный
интерфейсинтерфейс
interface Elephant {
boolean isProud();
}
interface Dog {
boolean isProud();
}
System.out.println("Слон горделив: " + e.isProud());
System.out.println("Моська горделива: " + d.isProud());
System.out.println("Моська-слон горделив: " + elephantDog.isProud());
OUTPUT:
Слон горделив: false
Моська горделива: true
Моська-слон горделив: false
Функциональный интерфейсФункциональный интерфейс
вызываем точно так жевызываем точно так же
Подробнее проПодробнее про
ПредикатыПредикаты
1. Обычный предикат:
public Predicate<Integer> isGreaterThan2New() {
return a -> a > 2;
}
Как это выглядело раньше:
public boolean isGreaterThan2Old(Integer a) {
return a > 2;
}
2. Обычный би-предикат:
public BiPredicate<Integer, Integer> isGreaterThanFunc() {
return (a, b) -> a > b;
}
Как это выглядело раньше:
public boolean isGreaterThan(Integer a, Integer b) {
return a > b;
}
ВсегдаВсегда
возвращаютвозвращают
булеан,булеан,
реализуютреализуют
интерфейс синтерфейс с
методомметодом
booleanboolean testtest((TT t)t);;
Если реализуется метод boolean test(T t),Если реализуется метод boolean test(T t),
почему нигде нет этого названия?почему нигде нет этого названия?
Подробнее проПодробнее про
ФункцииФункции
1. Обычный предикат:
public Function<Integer, Integer> multiplyFuncBy2() {
return (a) -> a * 2;
}
Как это выглядело раньше:
public Integer multiplyBy2(Integer a) {
return a * 2;
}
2. Обычный би-предикат:
public BiFunction<Integer, Integer, Integer> multiplyFuncBy() {
return (a, b) -> a * b;
}
Как это выглядело раньше:
public Integer multiplyFuncBy(Integer a, Integer b) {
return a * b;
}
В отличие отВ отличие от
предикатов,предикатов,
возвращают тип,возвращают тип,
указанный науказанный на
последнем месте ипоследнем месте и
принимает типы,принимает типы,
указанные вначалеуказанные вначале
Как применяемКак применяем
предикатыпредикаты
1. Обычный и би-предикат, аналогичные методы:
boolean actual = p.isGreaterThan2New().test(4);
boolean actual = p.isGreaterThan2Old(4);
p.isGreaterThanNew().test(4, 8);
p.isGreaterThanOld(4, 8);
2. Предикат и соответствующий метод в стриме:
values.stream().filter(p.isGreaterThan2New( ))
.collect(Collectors.toList());
List<Integer> actual = values.stream()
.filter(v ->
p.isGreaterThan2(v)).collect(Collectors.toList());
Нету параметра.Нету параметра.
Стрим самСтрим сам
передает.передает.
Как применяемКак применяем
функции?функции?
1. Обычная и би-функция, аналогичные методы:
int actual = f.multiplyFuncBy2().apply(5);
int actual = f.multiplyBy2(5);
f.multiplyFuncBy().apply(5, 3);
f.multiplyBy(5, 3);
2. Функция и соответствующий метод в стриме:
values.stream().map(f.multiplyFuncBy2()).skip(2).limit(2).collect(
Collectors.toList());
List<Integer> actual = values.stream()
.map(v -> f.multiplyFuncBy().apply(v, 3))
.skip(2).limit(2).collect(Collectors.toList());
Параметр передаетсяПараметр передается
через apply()через apply()
Подробнее проПодробнее про
Consumer - потребительConsumer - потребитель
1.Обычный void метод превращается в консьюмер:
public <T> void useConsumer(T t){
System.out.print("Consumer says: " + t);
}
public <T> Consumer<T> useConsumerFunc(){
return (t) -> System.out.print("Consumer says: " + t);
}
2.Разница в использовании:
consumer.useConsumer("Hello ;)");
consumer.useConsumerFunc().accept("Hello ;)");
3.Использование консьюмера в стриме:
Stream.of(1, 6).forEach(consumer.useConsumerFunc()
.andThen(l -> System.out.print("n")));
OUTPUT:
Consumer says: 1
Consumer says: 6
Подробнее проПодробнее про
Supplier - поставщикSupplier - поставщик
1. 2 -метода обычный и поставщик
public String useSupplier() {
return Thread.currentThread().getStackTrace()
[1].getMethodName();
}
public Supplier<String> useSupplierFunc() {
System.out.println(Thread.currentThread().getStackTr
ace()[1].getMethodName());
return () -> Thread.currentThread().getStackTrace()
[1].getMethodName();
}
Supplier - поставщикSupplier - поставщик
1. Тесты:
String actual = supplier.useSupplier();
String actual = supplier.useSupplierFunc().get();
Stream.of("1 ").forEach(n -> System.out.println(n +
supplier.useSupplierFunc()));
2. Вывод:
1) useSupplier
2) useSupplierFunc
lambda$useSupplierFunc$0
3) useSupplierFunc
1 lambdas.functionalInterface.MySupplier$
$Lambda$1/1449621165@3d8c7aca
Это совсем не все,Это совсем не все,
но основное, чтоно основное, что
надо знать о Javaнадо знать о Java
Тут код с презентации и слайды
https://github.com/olexandra-dmytrenko/LambdasForConfs.git
Спасибо заСпасибо за
внимание :)внимание :)

More Related Content

What's hot

Reactive extensions
Reactive extensionsReactive extensions
Reactive extensions
Sergey Teplyakov
 
основы Java переменные, циклы
основы Java   переменные, циклыосновы Java   переменные, циклы
основы Java переменные, циклы
Sergey Nemchinsky
 
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...
pgdayrussia
 
Урок 1. Что такое функциональное программирование
Урок 1. Что такое функциональное программированиеУрок 1. Что такое функциональное программирование
Урок 1. Что такое функциональное программирование
Система дистанционного обучения MyDLS
 
алгоритмы stl
алгоритмы stlалгоритмы stl
алгоритмы stl
mcroitor
 
Lambdas in java 8
Lambdas in java 8Lambdas in java 8
Lambdas in java 8
chashnikov
 
Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияМихаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияYandex
 
Алгоритмы поиска и сортировки
Алгоритмы  поиска и сортировкиАлгоритмы  поиска и сортировки
Алгоритмы поиска и сортировки
Unguryan Vitaliy
 
Java. Cистемы счислния, битовые операции
Java. Cистемы счислния, битовые операцииJava. Cистемы счислния, битовые операции
Java. Cистемы счислния, битовые операции
Unguryan Vitaliy
 
Java. Методы
Java. Методы Java. Методы
Java. Методы
Unguryan Vitaliy
 
Лекция 6
Лекция 6Лекция 6
Лекция 6itc73
 
Swift School #2
Swift School #2Swift School #2
Swift School #2
Sergey Pronin
 
Урок 8. Введение в редукцию графов
Урок 8. Введение в редукцию графовУрок 8. Введение в редукцию графов
Урок 8. Введение в редукцию графов
Система дистанционного обучения MyDLS
 
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стиль
Python Meetup
 
Красота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки PythonКрасота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки Python
Python Meetup
 
стандартная библиотека с++: введение
стандартная библиотека с++: введениестандартная библиотека с++: введение
стандартная библиотека с++: введение
mcroitor
 
Михаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияМихаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знания
Yandex
 
Введение в Clojure (Никита Прокопов)
Введение в Clojure (Никита Прокопов)Введение в Clojure (Никита Прокопов)
Введение в Clojure (Никита Прокопов)
mainstreamless
 

What's hot (19)

Reactive extensions
Reactive extensionsReactive extensions
Reactive extensions
 
основы Java переменные, циклы
основы Java   переменные, циклыосновы Java   переменные, циклы
основы Java переменные, циклы
 
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...
 
Урок 1. Что такое функциональное программирование
Урок 1. Что такое функциональное программированиеУрок 1. Что такое функциональное программирование
Урок 1. Что такое функциональное программирование
 
алгоритмы stl
алгоритмы stlалгоритмы stl
алгоритмы stl
 
десант презентация
десант презентациядесант презентация
десант презентация
 
Lambdas in java 8
Lambdas in java 8Lambdas in java 8
Lambdas in java 8
 
Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияМихаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знания
 
Алгоритмы поиска и сортировки
Алгоритмы  поиска и сортировкиАлгоритмы  поиска и сортировки
Алгоритмы поиска и сортировки
 
Java. Cистемы счислния, битовые операции
Java. Cистемы счислния, битовые операцииJava. Cистемы счислния, битовые операции
Java. Cистемы счислния, битовые операции
 
Java. Методы
Java. Методы Java. Методы
Java. Методы
 
Лекция 6
Лекция 6Лекция 6
Лекция 6
 
Swift School #2
Swift School #2Swift School #2
Swift School #2
 
Урок 8. Введение в редукцию графов
Урок 8. Введение в редукцию графовУрок 8. Введение в редукцию графов
Урок 8. Введение в редукцию графов
 
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стиль
 
Красота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки PythonКрасота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки Python
 
стандартная библиотека с++: введение
стандартная библиотека с++: введениестандартная библиотека с++: введение
стандартная библиотека с++: введение
 
Михаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияМихаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знания
 
Введение в Clojure (Никита Прокопов)
Введение в Clojure (Никита Прокопов)Введение в Clojure (Никита Прокопов)
Введение в Clojure (Никита Прокопов)
 

Viewers also liked

Becoming Your Best: New Executive Director Training
Becoming Your Best:  New Executive Director Training Becoming Your Best:  New Executive Director Training
Becoming Your Best: New Executive Director Training
nado-web
 
La era mesozoica
La era mesozoicaLa era mesozoica
La era mesozoica
luis castro
 
Approach to primary glomerulonnephritis
Approach to primary glomerulonnephritisApproach to primary glomerulonnephritis
Approach to primary glomerulonnephritis
Gaurav Kumar
 
SUAFCHI2016_ClosingRelease
SUAFCHI2016_ClosingReleaseSUAFCHI2016_ClosingRelease
SUAFCHI2016_ClosingReleaseSteve Zavattero
 
Portafolio servicios
Portafolio serviciosPortafolio servicios
Portafolio servicios
Wildemar Muriel Muriel
 
Advertising campaigns
Advertising campaigns Advertising campaigns
Advertising campaigns
eb05065704
 
Analysis of professional photographs
Analysis of professional photographsAnalysis of professional photographs
Analysis of professional photographs
eb05065704
 
Система комплексного анализа хозяйственной деятельности
Система комплексного анализа хозяйственной деятельностиСистема комплексного анализа хозяйственной деятельности
Система комплексного анализа хозяйственной деятельности
Svetlana Chernyshevich
 
Определение метода АХД в специальной экономической литературе
Определение метода АХД в специальной экономической литературеОпределение метода АХД в специальной экономической литературе
Определение метода АХД в специальной экономической литературе
Александр Давидович
 
Andrew Hait, U.S. Census Bureau
Andrew Hait, U.S. Census BureauAndrew Hait, U.S. Census Bureau
Andrew Hait, U.S. Census Bureau
nado-web
 
Mi región y yo
Mi región y yoMi región y yo
Mi región y yo
Jahiro Mejia Acevedo
 

Viewers also liked (15)

Becoming Your Best: New Executive Director Training
Becoming Your Best:  New Executive Director Training Becoming Your Best:  New Executive Director Training
Becoming Your Best: New Executive Director Training
 
La era mesozoica
La era mesozoicaLa era mesozoica
La era mesozoica
 
Approach to primary glomerulonnephritis
Approach to primary glomerulonnephritisApproach to primary glomerulonnephritis
Approach to primary glomerulonnephritis
 
Yuly trabajo de tecnologia
Yuly trabajo de tecnologiaYuly trabajo de tecnologia
Yuly trabajo de tecnologia
 
SUAFCHI2016_ClosingRelease
SUAFCHI2016_ClosingReleaseSUAFCHI2016_ClosingRelease
SUAFCHI2016_ClosingRelease
 
Portafolio servicios
Portafolio serviciosPortafolio servicios
Portafolio servicios
 
Advertising campaigns
Advertising campaigns Advertising campaigns
Advertising campaigns
 
Energy Centre
Energy CentreEnergy Centre
Energy Centre
 
Czas dla Boga
Czas dla BogaCzas dla Boga
Czas dla Boga
 
Analysis of professional photographs
Analysis of professional photographsAnalysis of professional photographs
Analysis of professional photographs
 
summer ppt
summer pptsummer ppt
summer ppt
 
Система комплексного анализа хозяйственной деятельности
Система комплексного анализа хозяйственной деятельностиСистема комплексного анализа хозяйственной деятельности
Система комплексного анализа хозяйственной деятельности
 
Определение метода АХД в специальной экономической литературе
Определение метода АХД в специальной экономической литературеОпределение метода АХД в специальной экономической литературе
Определение метода АХД в специальной экономической литературе
 
Andrew Hait, U.S. Census Bureau
Andrew Hait, U.S. Census BureauAndrew Hait, U.S. Census Bureau
Andrew Hait, U.S. Census Bureau
 
Mi región y yo
Mi región y yoMi región y yo
Mi región y yo
 

Similar to Discovering Lambdas (Speech)

Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey TeplyakovAlex Tumanoff
 
Интерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монадИнтерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монад
Zheka Kozlov
 
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
OdessaFrontend
 
Java 8 puzzlers
Java 8 puzzlersJava 8 puzzlers
Java 8 puzzlers
Evgeny Borisov
 
Очень вкусный фрукт Guava
Очень вкусный фрукт GuavaОчень вкусный фрукт Guava
Очень вкусный фрукт Guava
Egor Chernyshev
 
Statis code analysis
Statis code analysisStatis code analysis
Statis code analysis
chashnikov
 
Мир Python функционалим с помощью библиотек
Мир Python  функционалим с помощью библиотекМир Python  функционалим с помощью библиотек
Мир Python функционалим с помощью библиотек
PyNSK
 
Язык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистовЯзык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистов
Andrew Shitov
 
Mike ponomarenko java17-fork-v1.2
Mike ponomarenko java17-fork-v1.2Mike ponomarenko java17-fork-v1.2
Mike ponomarenko java17-fork-v1.2
Alex Tumanoff
 
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU
 
Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVM
Tech Talks @NSU
 
Характерные черты функциональных языков программирования
Характерные черты функциональных языков программированияХарактерные черты функциональных языков программирования
Характерные черты функциональных языков программированияAlex.Kolonitsky
 
Урок 4. "Завязывание узлов". Классы
Урок 4. "Завязывание узлов". КлассыУрок 4. "Завязывание узлов". Классы
Урок 4. "Завязывание узлов". Классы
Система дистанционного обучения MyDLS
 
Функциональный .NET
Функциональный .NETФункциональный .NET
Функциональный .NET
Roman Nevolin
 
C# Deep Dive
C# Deep DiveC# Deep Dive
C# Deep Dive
LuxoftTraining
 
Ecma script 6 in action
Ecma script 6 in actionEcma script 6 in action
Ecma script 6 in action
Yuri Trukhin
 
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
solit
 
Functional Programing
Functional ProgramingFunctional Programing
Functional Programing
Max Arshinov
 
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон ПолухинC++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
corehard_by
 

Similar to Discovering Lambdas (Speech) (20)

Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey Teplyakov
 
Интерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монадИнтерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монад
 
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
 
Java 8 puzzlers
Java 8 puzzlersJava 8 puzzlers
Java 8 puzzlers
 
Очень вкусный фрукт Guava
Очень вкусный фрукт GuavaОчень вкусный фрукт Guava
Очень вкусный фрукт Guava
 
Statis code analysis
Statis code analysisStatis code analysis
Statis code analysis
 
Мир Python функционалим с помощью библиотек
Мир Python  функционалим с помощью библиотекМир Python  функционалим с помощью библиотек
Мир Python функционалим с помощью библиотек
 
Язык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистовЯзык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистов
 
Mike ponomarenko java17-fork-v1.2
Mike ponomarenko java17-fork-v1.2Mike ponomarenko java17-fork-v1.2
Mike ponomarenko java17-fork-v1.2
 
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVM
 
Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVM
 
Характерные черты функциональных языков программирования
Характерные черты функциональных языков программированияХарактерные черты функциональных языков программирования
Характерные черты функциональных языков программирования
 
Урок 4. "Завязывание узлов". Классы
Урок 4. "Завязывание узлов". КлассыУрок 4. "Завязывание узлов". Классы
Урок 4. "Завязывание узлов". Классы
 
Функциональный .NET
Функциональный .NETФункциональный .NET
Функциональный .NET
 
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
 
Ecma script 6 in action
Ecma script 6 in actionEcma script 6 in action
Ecma script 6 in action
 
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
 
Functional Programing
Functional ProgramingFunctional Programing
Functional Programing
 
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон ПолухинC++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
 

More from Olexandra Dmytrenko

R2DBC - Good Enough for Production?
R2DBC - Good Enough for Production?R2DBC - Good Enough for Production?
R2DBC - Good Enough for Production?
Olexandra Dmytrenko
 
Playing programming with kids and bb-8
Playing programming with kids and bb-8Playing programming with kids and bb-8
Playing programming with kids and bb-8
Olexandra Dmytrenko
 
Playing Programming with Kids and BB-8
Playing Programming with Kids and BB-8Playing Programming with Kids and BB-8
Playing Programming with Kids and BB-8
Olexandra Dmytrenko
 
Память в Java. Garbage Collector
Память в Java. Garbage CollectorПамять в Java. Garbage Collector
Память в Java. Garbage Collector
Olexandra Dmytrenko
 
Рекурсия. Поиск
Рекурсия. ПоискРекурсия. Поиск
Рекурсия. Поиск
Olexandra Dmytrenko
 
Собеседование на позицию Java Developer
Собеседование на позицию Java DeveloperСобеседование на позицию Java Developer
Собеседование на позицию Java Developer
Olexandra Dmytrenko
 
HTML Tables
HTML TablesHTML Tables
HTML Tables
Olexandra Dmytrenko
 

More from Olexandra Dmytrenko (9)

R2DBC - Good Enough for Production?
R2DBC - Good Enough for Production?R2DBC - Good Enough for Production?
R2DBC - Good Enough for Production?
 
Playing programming with kids and bb-8
Playing programming with kids and bb-8Playing programming with kids and bb-8
Playing programming with kids and bb-8
 
Playing Programming with Kids and BB-8
Playing Programming with Kids and BB-8Playing Programming with Kids and BB-8
Playing Programming with Kids and BB-8
 
Память в Java. Garbage Collector
Память в Java. Garbage CollectorПамять в Java. Garbage Collector
Память в Java. Garbage Collector
 
Рекурсия. Поиск
Рекурсия. ПоискРекурсия. Поиск
Рекурсия. Поиск
 
Собеседование на позицию Java Developer
Собеседование на позицию Java DeveloperСобеседование на позицию Java Developer
Собеседование на позицию Java Developer
 
HTML Tables
HTML TablesHTML Tables
HTML Tables
 
Functional Programming
Functional ProgrammingFunctional Programming
Functional Programming
 
itake
itakeitake
itake
 

Discovering Lambdas (Speech)

  • 1. Discovering Lambdas inDiscovering Lambdas in Java8Java8 by Aleksandra Dmytrenkoby Aleksandra Dmytrenko
  • 2. ПланПлан Старая добрая Java -> Функциональное программирование Как посчитать факториал? Слон и моська в одном Функциональные интерфейсы
  • 4. Чем ФП приятно?Чем ФП приятно? Функция не может поменять значение переменной вне своей видимости, все переменные final (рай для юнит тестов) Внешние состояние не влияет на функцию (удобно отлаживать и замещать части кода). Встроенная многопоточность (кому нравится думать про «разделяй и властвуй?») Ленивые (отложенные) вычисления - выполняется только нужный код в момент, когда надо результат.
  • 5. Чем ФП чревато?Чем ФП чревато? Состояние не хранится (нет переменных) Все переменные final или const, нет public (как вам код с такими ограничениями?) Встроенная многопоточность (к сожалению пока не на высшем уровне) Ленивые (отложенные) вычисления - выполняется только используемый код в «когда захочу» момент. Тяжело контролировать очередность действий.
  • 7. Как определить,Как определить, простое ли число?простое ли число?
  • 9. КАК делаем -> ЧТОКАК делаем -> ЧТО делаем?делаем? Imperative style: public boolean isPrime(int number) { for (int curNumb = 2; curNumb <= number/2; curNumb++) { if (number % curNumb == 0) { return false; } } return true; } DECLARATIVE STYLE: public boolean isPrimeDeclarative(final int number) { return IntStream.rangeClosed(2, number/2) .noneMatch(curNumb -> number % curNumb == 0); }
  • 10. Добавим проверку наДобавим проверку на знак числазнак числа public boolean isPrimeImperative(int number) { if (number < 0) { return false; } for (int curNumb = 2; curNumb <= number / 2; curNumb++) { if (number % curNumb == 0) { return false; } } return true; } public boolean isPrimeDeclarativeNegativeNumbCheck(final int number) { return number >= 0 && IntStream.rangeClosed(2, number.2) .noneMatch(curNumb -> number % curNumb == 0); }
  • 11. Ну… надо бы еще наНу… надо бы еще на что-то посмотретьчто-то посмотреть
  • 12. Кого на собеседовании неКого на собеседовании не просили посчитать факториал?просили посчитать факториал? public static int factorialOf(int number) { if (number >= 0) { int factorial = 1; for (int curNumb = 2; curNumb <= number; curNumb++){ factorial = factorial * curNumber; } return factorial; } else throw new IllegalArgumentException("Factorial can be counted only of not negative numbers."); } 6 строчек!
  • 13. public static int factorialOf(int number) { if (number > 0) return number*factorialOf(number-1); if (number == 0) return 1; else throw new IllegalArgumentException("Factorial can be counted only of not negative numbers."); } 3 строчки! Факториал через цикл каждыйФакториал через цикл каждый напишет. А рекурсия во чтонапишет. А рекурсия во что обойдется?обойдется? public static int factorialOf(int number) { if (number >= 0) return IntStream.rangeClosed(2, number) .reduce(1, (accResult, curNumb) -> accResult * curNumb); else throw new IllegalArgumentException("Factorial can be counted only of not negative numbers."); } 3 строчки!
  • 14. – Я и многие другие “Не делайте что-то только потому, что вы можете это сделать. Делайте красиво.”
  • 15. Chuck Norris can do multipleChuck Norris can do multiple inheritance in Javainheritance in Java
  • 16. Я скажу вамЯ скажу вам больше, не толькобольше, не только он может. Вы тоже!он может. Вы тоже! С помощьюС помощью интерфейсов,интерфейсов, правда.правда.
  • 17. А что если бы Cлон был Моськой, аА что если бы Cлон был Моськой, а Моська Cлоном?Моська Cлоном? interface Elephant { default String makeSound(String name) { return name + ": Не злите меня!"; } } interface Dog { default String makeSound(String name) { return name + ": Гав-гав"; } }
  • 18. class EveryDogWantsToBeAnElephant implements Dog, Elephant { @Override public String makeSound(String name) { return name + ": Я спокоен"; } public static void main(final String[] args) { EveryDogWantsToBeAnElephant elephantDog = new EveryDogWantsToBeAnElephant(); Elephant e = new Elephant(){}; Dog d = new Dog(){}; System.out.println(e.makeSound("Слон")); System.out.println(d.makeSound("Моська")); System.out.println(elephantDog.makeSound("Моська-слон")); }} А что если бы Cлон был Моськой, аА что если бы Cлон был Моськой, а Моська Cлоном?Моська Cлоном? СлонСлон: Не злите меня!: Не злите меня! МоськаМоська: Гав-гав: Гав-гав МоськаМоська--слонслон: Я спокоен: Я спокоен
  • 19. Множественное наследование - это когда есть дефолтная реализация метода с одинаковым названием в каждом интерфейсе. А как себя будут вести статические и абстрактные методы?
  • 20. Статические методыСтатические методы К ним мы обращаемся как НазваниеКласса.имяМетода. По сути эта комбинация всегда уникальна и ее можно воспринимать целиком, как название interface Dog { static String walk() { return "Я бегаю быстренько своими маленькими лапками.»; }} interface Elephant { static String walk() { return "Я большой и ступаю тихо но тяжело."; }} —————————————————————— ——————————————— System.out.println(Elephant.walk()); System.out.println(Dog.walk()); OUTPUT: Я большой и ступаю тихо но тяжело. Я бегаю быстренько своими маленькими лапками.
  • 21. Абстрактные методыАбстрактные методы Когда мы инстанциируем абстрактный класс (интерфейс), то надо реализовать все абстрактные методы. Но если мы имплементируем интерфейсы с одинаковыми названиями методов, достаточно описать только один из них.
  • 22. Пример: Comparator с его int compare(T o1, T o2), Comparable с его int compareTo(T o) и другие Интерфейс, у которого есть только один абстрактный метод называется функциональным интерфейсом
  • 23. 1. Можно по-старинке: Elephant e = new Elephant() { @Override public boolean isProud() { return false; } }; 2. Можно по-модному: Elephant e = () -> { return false; }; 3. А можно без лишних слов: Elephant e = () -> false; Реализуем функциональныйРеализуем функциональный интерфейсинтерфейс
  • 24. interface Elephant { boolean isProud(); } interface Dog { boolean isProud(); } System.out.println("Слон горделив: " + e.isProud()); System.out.println("Моська горделива: " + d.isProud()); System.out.println("Моська-слон горделив: " + elephantDog.isProud()); OUTPUT: Слон горделив: false Моська горделива: true Моська-слон горделив: false Функциональный интерфейсФункциональный интерфейс вызываем точно так жевызываем точно так же
  • 26. ПредикатыПредикаты 1. Обычный предикат: public Predicate<Integer> isGreaterThan2New() { return a -> a > 2; } Как это выглядело раньше: public boolean isGreaterThan2Old(Integer a) { return a > 2; } 2. Обычный би-предикат: public BiPredicate<Integer, Integer> isGreaterThanFunc() { return (a, b) -> a > b; } Как это выглядело раньше: public boolean isGreaterThan(Integer a, Integer b) { return a > b; } ВсегдаВсегда возвращаютвозвращают булеан,булеан, реализуютреализуют интерфейс синтерфейс с методомметодом booleanboolean testtest((TT t)t);; Если реализуется метод boolean test(T t),Если реализуется метод boolean test(T t), почему нигде нет этого названия?почему нигде нет этого названия?
  • 28. ФункцииФункции 1. Обычный предикат: public Function<Integer, Integer> multiplyFuncBy2() { return (a) -> a * 2; } Как это выглядело раньше: public Integer multiplyBy2(Integer a) { return a * 2; } 2. Обычный би-предикат: public BiFunction<Integer, Integer, Integer> multiplyFuncBy() { return (a, b) -> a * b; } Как это выглядело раньше: public Integer multiplyFuncBy(Integer a, Integer b) { return a * b; } В отличие отВ отличие от предикатов,предикатов, возвращают тип,возвращают тип, указанный науказанный на последнем месте ипоследнем месте и принимает типы,принимает типы, указанные вначалеуказанные вначале
  • 29. Как применяемКак применяем предикатыпредикаты 1. Обычный и би-предикат, аналогичные методы: boolean actual = p.isGreaterThan2New().test(4); boolean actual = p.isGreaterThan2Old(4); p.isGreaterThanNew().test(4, 8); p.isGreaterThanOld(4, 8); 2. Предикат и соответствующий метод в стриме: values.stream().filter(p.isGreaterThan2New( )) .collect(Collectors.toList()); List<Integer> actual = values.stream() .filter(v -> p.isGreaterThan2(v)).collect(Collectors.toList()); Нету параметра.Нету параметра. Стрим самСтрим сам передает.передает.
  • 30. Как применяемКак применяем функции?функции? 1. Обычная и би-функция, аналогичные методы: int actual = f.multiplyFuncBy2().apply(5); int actual = f.multiplyBy2(5); f.multiplyFuncBy().apply(5, 3); f.multiplyBy(5, 3); 2. Функция и соответствующий метод в стриме: values.stream().map(f.multiplyFuncBy2()).skip(2).limit(2).collect( Collectors.toList()); List<Integer> actual = values.stream() .map(v -> f.multiplyFuncBy().apply(v, 3)) .skip(2).limit(2).collect(Collectors.toList()); Параметр передаетсяПараметр передается через apply()через apply()
  • 32. Consumer - потребительConsumer - потребитель 1.Обычный void метод превращается в консьюмер: public <T> void useConsumer(T t){ System.out.print("Consumer says: " + t); } public <T> Consumer<T> useConsumerFunc(){ return (t) -> System.out.print("Consumer says: " + t); } 2.Разница в использовании: consumer.useConsumer("Hello ;)"); consumer.useConsumerFunc().accept("Hello ;)"); 3.Использование консьюмера в стриме: Stream.of(1, 6).forEach(consumer.useConsumerFunc() .andThen(l -> System.out.print("n"))); OUTPUT: Consumer says: 1 Consumer says: 6
  • 34. Supplier - поставщикSupplier - поставщик 1. 2 -метода обычный и поставщик public String useSupplier() { return Thread.currentThread().getStackTrace() [1].getMethodName(); } public Supplier<String> useSupplierFunc() { System.out.println(Thread.currentThread().getStackTr ace()[1].getMethodName()); return () -> Thread.currentThread().getStackTrace() [1].getMethodName(); }
  • 35. Supplier - поставщикSupplier - поставщик 1. Тесты: String actual = supplier.useSupplier(); String actual = supplier.useSupplierFunc().get(); Stream.of("1 ").forEach(n -> System.out.println(n + supplier.useSupplierFunc())); 2. Вывод: 1) useSupplier 2) useSupplierFunc lambda$useSupplierFunc$0 3) useSupplierFunc 1 lambdas.functionalInterface.MySupplier$ $Lambda$1/1449621165@3d8c7aca
  • 36. Это совсем не все,Это совсем не все, но основное, чтоно основное, что надо знать о Javaнадо знать о Java Тут код с презентации и слайды https://github.com/olexandra-dmytrenko/LambdasForConfs.git