SlideShare a Scribd company logo
1 of 37
Download to read offline
Discovering Lambdas in Java8
by 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 multiple inheritance in
Java
Я скажу вам больше, не
только он может. Вы тоже! С
помощью интерфейсов,
правда.
А что если бы 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лоном?
Слон: Не злите меня!
Моська: Гав-гав
Моська-слон: Я спокоен
Множественное наследование - это когда есть дефолтная
реализация метода с одинаковым названием в каждом
интерфейсе.
А как себя будут вести статические и абстрактные методы?
Статические методы
К ним мы обращаемся как
НазваниеКласса.имяМетода. По сути эта
комбинация всегда уникальна и ее можно
воспринимать целиком, как название
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;
}
Всегда возвращают
булеан, реализуют
интерфейс с методом
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()
Подробнее про
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 - поставщик
1. 2 метода - обычный и поставщик
    public String useSupplier() {
return Thread.currentThread().getStackTrace()[1].getMethodName();
}
public Supplier<String> useSupplierFunc() {
System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName());
return () -> Thread.currentThread().getStackTrace()[1].getMethodName();
}
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
Тут код с презентации и слайды
https://github.com/olexandra-dmytrenko/LambdasForConfs.git
Спасибо за внимание :)

More Related Content

What's hot

Алгоритмы поиска и сортировки
Алгоритмы  поиска и сортировкиАлгоритмы  поиска и сортировки
Алгоритмы поиска и сортировкиUnguryan Vitaliy
 
алгоритмы stl
алгоритмы stlалгоритмы stl
алгоритмы stlmcroitor
 
Алгоритмы решения задачи о булевой выполнимости (SAT) и их применение в крипт...
Алгоритмы решения задачи о булевой выполнимости (SAT) и их применение в крипт...Алгоритмы решения задачи о булевой выполнимости (SAT) и их применение в крипт...
Алгоритмы решения задачи о булевой выполнимости (SAT) и их применение в крипт...Positive Hack Days
 
основы Java переменные, циклы
основы Java   переменные, циклыосновы Java   переменные, циклы
основы Java переменные, циклыSergey Nemchinsky
 
9. java lecture library
9. java lecture library9. java lecture library
9. java lecture libraryMERA_school
 
Java. Логические операторы, операторы ветвления.
Java. Логические операторы, операторы ветвления.Java. Логические операторы, операторы ветвления.
Java. Логические операторы, операторы ветвления.Unguryan Vitaliy
 
Java. Интерфейс Map - ассоциативные массивы.
Java. Интерфейс Map - ассоциативные массивы.Java. Интерфейс Map - ассоциативные массивы.
Java. Интерфейс Map - ассоциативные массивы.Unguryan Vitaliy
 
5. java lecture io
5. java lecture io5. java lecture io
5. java lecture ioMERA_school
 
Java. Cистемы счислния, битовые операции
Java. Cистемы счислния, битовые операцииJava. Cистемы счислния, битовые операции
Java. Cистемы счислния, битовые операцииUnguryan Vitaliy
 
Java. Массивы. Многомерные массивы.
Java. Массивы. Многомерные массивы.Java. Массивы. Многомерные массивы.
Java. Массивы. Многомерные массивы.Unguryan Vitaliy
 

What's hot (14)

Reactive extensions
Reactive extensionsReactive extensions
Reactive extensions
 
Алгоритмы поиска и сортировки
Алгоритмы  поиска и сортировкиАлгоритмы  поиска и сортировки
Алгоритмы поиска и сортировки
 
алгоритмы stl
алгоритмы stlалгоритмы stl
алгоритмы stl
 
Алгоритмы решения задачи о булевой выполнимости (SAT) и их применение в крипт...
Алгоритмы решения задачи о булевой выполнимости (SAT) и их применение в крипт...Алгоритмы решения задачи о булевой выполнимости (SAT) и их применение в крипт...
Алгоритмы решения задачи о булевой выполнимости (SAT) и их применение в крипт...
 
Java. Методы
Java. Методы Java. Методы
Java. Методы
 
основы Java переменные, циклы
основы Java   переменные, циклыосновы Java   переменные, циклы
основы Java переменные, циклы
 
9. java lecture library
9. java lecture library9. java lecture library
9. java lecture library
 
List - списки
List - списки List - списки
List - списки
 
Java. Логические операторы, операторы ветвления.
Java. Логические операторы, операторы ветвления.Java. Логические операторы, операторы ветвления.
Java. Логические операторы, операторы ветвления.
 
Java. Интерфейс Map - ассоциативные массивы.
Java. Интерфейс Map - ассоциативные массивы.Java. Интерфейс Map - ассоциативные массивы.
Java. Интерфейс Map - ассоциативные массивы.
 
5. java lecture io
5. java lecture io5. java lecture io
5. java lecture io
 
Java. Cистемы счислния, битовые операции
Java. Cистемы счислния, битовые операцииJava. Cистемы счислния, битовые операции
Java. Cистемы счислния, битовые операции
 
Рекурсия. Поиск
Рекурсия. ПоискРекурсия. Поиск
Рекурсия. Поиск
 
Java. Массивы. Многомерные массивы.
Java. Массивы. Многомерные массивы.Java. Массивы. Многомерные массивы.
Java. Массивы. Многомерные массивы.
 

Similar to Discovering Lambdas in Java 8

Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...OdessaFrontend
 
Mike ponomarenko java17-fork-v1.2
Mike ponomarenko java17-fork-v1.2Mike ponomarenko java17-fork-v1.2
Mike ponomarenko java17-fork-v1.2Alex Tumanoff
 
C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.Igor Shkulipa
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey TeplyakovAlex Tumanoff
 
C# Desktop. Занятие 03.
C# Desktop. Занятие 03.C# Desktop. Занятие 03.
C# Desktop. Занятие 03.Igor Shkulipa
 
Очень вкусный фрукт Guava
Очень вкусный фрукт GuavaОчень вкусный фрукт Guava
Очень вкусный фрукт GuavaEgor Chernyshev
 
Statis code analysis
Statis code analysisStatis code analysis
Statis code analysischashnikov
 
Функциональный .NET
Функциональный .NETФункциональный .NET
Функциональный .NETRoman Nevolin
 
Характерные черты функциональных языков программирования
Характерные черты функциональных языков программированияХарактерные черты функциональных языков программирования
Характерные черты функциональных языков программированияAlex.Kolonitsky
 
Николай Паламарчук "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
 
Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияМихаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияYandex
 
Как программировать на JavaScript и не выстрелить себе в ногу
Как программировать на JavaScript и не выстрелить себе в ногуКак программировать на JavaScript и не выстрелить себе в ногу
Как программировать на JavaScript и не выстрелить себе в ногуAndreyGeonya
 
Мир Python функционалим с помощью библиотек
Мир Python  функционалим с помощью библиотекМир Python  функционалим с помощью библиотек
Мир Python функционалим с помощью библиотекPyNSK
 
Поговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языкаПоговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языкаAlexander Kucherenko
 
Ecma script 6 in action
Ecma script 6 in actionEcma script 6 in action
Ecma script 6 in actionYuri Trukhin
 

Similar to Discovering Lambdas in Java 8 (20)

Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
 
Mike ponomarenko java17-fork-v1.2
Mike ponomarenko java17-fork-v1.2Mike ponomarenko java17-fork-v1.2
Mike ponomarenko java17-fork-v1.2
 
C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.
 
Урок 8. Введение в редукцию графов
Урок 8. Введение в редукцию графовУрок 8. Введение в редукцию графов
Урок 8. Введение в редукцию графов
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey Teplyakov
 
C# Desktop. Занятие 03.
C# Desktop. Занятие 03.C# Desktop. Занятие 03.
C# Desktop. Занятие 03.
 
Очень вкусный фрукт Guava
Очень вкусный фрукт GuavaОчень вкусный фрукт Guava
Очень вкусный фрукт Guava
 
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
 
Statis code analysis
Statis code analysisStatis code analysis
Statis code analysis
 
Функциональный .NET
Функциональный .NETФункциональный .NET
Функциональный .NET
 
Характерные черты функциональных языков программирования
Характерные черты функциональных языков программированияХарактерные черты функциональных языков программирования
Характерные черты функциональных языков программирования
 
Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"
 
Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияМихаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знания
 
Как программировать на JavaScript и не выстрелить себе в ногу
Как программировать на JavaScript и не выстрелить себе в ногуКак программировать на JavaScript и не выстрелить себе в ногу
Как программировать на JavaScript и не выстрелить себе в ногу
 
Мир Python функционалим с помощью библиотек
Мир Python  функционалим с помощью библиотекМир Python  функционалим с помощью библиотек
Мир Python функционалим с помощью библиотек
 
Step cpp022
Step cpp022Step cpp022
Step cpp022
 
Поговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языкаПоговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языка
 
Swift School #2
Swift School #2Swift School #2
Swift School #2
 
Ecma script 6 in action
Ecma script 6 in actionEcma script 6 in action
Ecma script 6 in action
 

More from Stfalcon Meetups

Conversion centered design 3
Conversion centered design 3Conversion centered design 3
Conversion centered design 3Stfalcon Meetups
 
Stfalcon QA Meetup 31.01.2020
Stfalcon QA Meetup 31.01.2020Stfalcon QA Meetup 31.01.2020
Stfalcon QA Meetup 31.01.2020Stfalcon Meetups
 
Stfalcon QA Meetup 31.01.2020
Stfalcon QA Meetup 31.01.2020Stfalcon QA Meetup 31.01.2020
Stfalcon QA Meetup 31.01.2020Stfalcon Meetups
 
Design of the_future_30_05_2019
Design of the_future_30_05_2019Design of the_future_30_05_2019
Design of the_future_30_05_2019Stfalcon Meetups
 
Global sales - a few insights
Global sales - a few insightsGlobal sales - a few insights
Global sales - a few insightsStfalcon Meetups
 
How to build your own startup
How to build your own startupHow to build your own startup
How to build your own startupStfalcon Meetups
 
Первая и последняя встреча с клиентом
Первая и последняя встреча с клиентом Первая и последняя встреча с клиентом
Первая и последняя встреча с клиентом Stfalcon Meetups
 
Парнерство нидерланды
Парнерство нидерландыПарнерство нидерланды
Парнерство нидерландыStfalcon Meetups
 
Риси гарного менеджера
Риси гарного менеджераРиси гарного менеджера
Риси гарного менеджераStfalcon Meetups
 
Между заказчиком и разработчиком
Между заказчиком и разработчикомМежду заказчиком и разработчиком
Между заказчиком и разработчикомStfalcon Meetups
 
майстер-клас “Управління ризиками”
майстер-клас “Управління ризиками”майстер-клас “Управління ризиками”
майстер-клас “Управління ризиками”Stfalcon Meetups
 
Kubernetes: від знайомства до використання у CI/CD
Kubernetes: від знайомства до використання у CI/CDKubernetes: від знайомства до використання у CI/CD
Kubernetes: від знайомства до використання у CI/CDStfalcon Meetups
 

More from Stfalcon Meetups (20)

Conversion centered design 3
Conversion centered design 3Conversion centered design 3
Conversion centered design 3
 
Discovery phase
Discovery phaseDiscovery phase
Discovery phase
 
Stfalcon QA Meetup 31.01.2020
Stfalcon QA Meetup 31.01.2020Stfalcon QA Meetup 31.01.2020
Stfalcon QA Meetup 31.01.2020
 
Stfalcon QA Meetup 31.01.2020
Stfalcon QA Meetup 31.01.2020Stfalcon QA Meetup 31.01.2020
Stfalcon QA Meetup 31.01.2020
 
Stfalcon PM Meetup 21.11
Stfalcon PM Meetup 21.11Stfalcon PM Meetup 21.11
Stfalcon PM Meetup 21.11
 
Stfalcon PM Meetup 21.11
Stfalcon PM Meetup 21.11Stfalcon PM Meetup 21.11
Stfalcon PM Meetup 21.11
 
Design of the_future_30_05_2019
Design of the_future_30_05_2019Design of the_future_30_05_2019
Design of the_future_30_05_2019
 
2 5404811386729530203
2 54048113867295302032 5404811386729530203
2 5404811386729530203
 
Team evolution
Team evolutionTeam evolution
Team evolution
 
Mobile&Privacy
Mobile&PrivacyMobile&Privacy
Mobile&Privacy
 
Global sales - a few insights
Global sales - a few insightsGlobal sales - a few insights
Global sales - a few insights
 
How to build your own startup
How to build your own startupHow to build your own startup
How to build your own startup
 
Первая и последняя встреча с клиентом
Первая и последняя встреча с клиентом Первая и последняя встреча с клиентом
Первая и последняя встреча с клиентом
 
Парнерство нидерланды
Парнерство нидерландыПарнерство нидерланды
Парнерство нидерланды
 
Риси гарного менеджера
Риси гарного менеджераРиси гарного менеджера
Риси гарного менеджера
 
Между заказчиком и разработчиком
Между заказчиком и разработчикомМежду заказчиком и разработчиком
Между заказчиком и разработчиком
 
Cv vs resume
Cv vs resumeCv vs resume
Cv vs resume
 
Vue.js
Vue.jsVue.js
Vue.js
 
майстер-клас “Управління ризиками”
майстер-клас “Управління ризиками”майстер-клас “Управління ризиками”
майстер-клас “Управління ризиками”
 
Kubernetes: від знайомства до використання у CI/CD
Kubernetes: від знайомства до використання у CI/CDKubernetes: від знайомства до використання у CI/CD
Kubernetes: від знайомства до використання у CI/CD
 

Discovering Lambdas in Java 8

  • 1. Discovering Lambdas in Java8 by Aleksandra Dmytrenko
  • 2. План Старая добрая Java -> Функциональное программирование Как посчитать факториал? Слон и моська в одном Функциональные интерфейсы
  • 4. Чем ФП приятно? Функция не может поменять значение переменной вне своей видимости, все переменные final (рай для юнит тестов) Внешние состояние не влияет на функцию (удобно отлаживать и замещать части кода). Встроенная многопоточность (кому нравится думать про «разделяй и властвуй?») Ленивые (отложенные) вычисления - выполняется только нужный код в момент, когда надо результат.
  • 5. Чем ФП чревато? Состояние не хранится (нет переменных) Все переменные final или const, нет public (как вам код с такими ограничениями?) Встроенная многопоточность (к сожалению пока не на высшем уровне) Ленивые (отложенные) вычисления - выполняется только используемый код в «когда захочу» момент. Тяжело контролировать очередность действий.
  • 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 multiple inheritance in Java
  • 16. Я скажу вам больше, не только он может. Вы тоже! С помощью интерфейсов, правда.
  • 17. А что если бы 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лоном? Слон: Не злите меня! Моська: Гав-гав Моська-слон: Я спокоен
  • 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; } Всегда возвращают булеан, реализуют интерфейс с методом 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()
  • 32. 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 - поставщик 1. 2 метода - обычный и поставщик     public String useSupplier() { return Thread.currentThread().getStackTrace()[1].getMethodName(); } public Supplier<String> useSupplierFunc() { System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName()); return () -> Thread.currentThread().getStackTrace()[1].getMethodName(); }
  • 35. 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 Тут код с презентации и слайды https://github.com/olexandra-dmytrenko/LambdasForConfs.git