Functional reactive full stack development in java/js (JPoint ed.)
-
Upload
vyacheslav-lapin -
Category
Software
-
view
243 -
download
2
Transcript of Functional reactive full stack development in java/js (JPoint ed.)
![Page 1: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/1.jpg)
1
Functional Reactive full-stack development in Java&JSMarch 27, 2016
![Page 2: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/2.jpg)
2
Vyacheslav Lapin
Vyacheslav Lapin
EPAM Systems, Senior Developer
• 10+ years experience in IT• 7+ Java-development experience• 5+ trainer experience• 3+ system analysisInterests:• Messaging (Nanomsg, Kafka)• Functional programming (Clojure,
Scala)
![Page 3: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/3.jpg)
3
2
1
3
Agenda
FRP• Проблема• Развенчание мифов о функциональном программировании• Анекдоты
FRP в Java• Optional, Stream`ы, CompletableFeature• RxJava, дружба с Apache Camel`ом• Speedment
Вести с фронта…
• RxJS
![Page 4: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/4.jpg)
4
FUNCTIONAL
Part 1
REACTIVEPROGRAMMING
![Page 5: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/5.jpg)
5
Functional Reactive Programming – Проблема
Гав? Мур? Иа? Ку-ка-ре-куу?
![Page 6: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/6.jpg)
6
Functional Reactive Programming – Проблема
Гордон Эрл Мур
«…количество транзисторов, размещаемых на кристалле интегральной схемы, удваивается каждые 24 месяца1»
Закон Мура1 Давид Хаус из Intel: «т.к. растёт ещё и быстродействие транзисторов, производительность процессоров должна удваиваться каждые 18 месяцев»
![Page 7: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/7.jpg)
7
Functional Reactive Programming – Проблема
«The free lunch is over»
Herb Sutterhttp://www.gotw.ca/publications/
concurrency-ddj.htm (Ru: https://habrahabr.ru/post/145432/)
![Page 8: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/8.jpg)
8
Functional Reactive Programming – Проблема
Джин Амдал
«В случае, когда задача разделяется на несколько частей, суммарное время её выполнения на параллельной системе не может быть меньше времени выполнения самого длинного фрагмента, при условии одинаковой скорости всех вычислителей.»
![Page 9: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/9.jpg)
9
- число задействованных
независимых процессоров
Functional Reactive Programming – Проблема
Джин Амдал
- последовательная доля рассчётов- распараллеливаемая долярассчётов
Максимально-возможное ускорение, которое может быть получено на вычислительной системе из процессоров, по сравнению с однопроцессорным решением
![Page 10: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/10.jpg)
10
Functional Reactive Programming – Проблема
Джин Амдал
Код
Код Код
100%
40%
Один процессор: X
10 процессоров: 2.174 * X
100 процессоров: 2.263 * X
1000 процессоров: 2.496 * X
…
![Page 11: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/11.jpg)
11
Functional Reactive Programming – Проблема
Джин Амдал
Код
Код Код
100%
25%…
Один процессор: X
10 процессоров: 3.077 * X
100 процессоров: 3.883 * X
1000 процессоров: 3.988 * X
![Page 12: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/12.jpg)
12
Functional Reactive Programming – Проблема
Джин Амдал
Один процессор: X
10 процессоров: 5.263 * X
100 процессоров: 9.174 * X
1000 процессоров: 9.910 * X
КодКод Код
100%
10% …
![Page 13: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/13.jpg)
13
• Осмысление предметной области в терминах неизменяемых значений и функций, которые их преобразуют.
Functional Reactive Programming – Определения
Functional programming
Reactive Programming
• Программирование асинхронной обработки и посылки данных
• Observer и EDA (Event-Driven Architecture)• Back-pressure: «Wow, wow, wow!.. НЕ ТАК БЫСТРО!!!»
![Page 14: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/14.jpg)
14
Приемущества
• Просто тестировать
Functional Reactive Programming – Определения
![Page 15: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/15.jpg)
15
Приемущества
• Просто тестировать• Меньше зависимостей
- проще читать.
Functional Reactive Programming – Определения
![Page 16: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/16.jpg)
16
Приемущества
• Просто тестировать• Меньше зависимостей -
проще читать.• Меньше ошибок
Functional Reactive Programming – Определения
![Page 17: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/17.jpg)
17
Приемущества
• Просто тестировать• Меньше зависимостей -
проще читать.• Меньше ошибок
Functional Reactive Programming – Определения
Недостатки
• Дольше (интереснее и сложнее) писать
![Page 18: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/18.jpg)
18
Functional Reactive Programming - Мифы
1. Функциональное программирование способен понять далеко не каждый…
![Page 19: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/19.jpg)
19
Functional Reactive Programming - Мифы
2. Писать в функциональном стиле можно лишь наtrue-функциональных языках!..
• Lisp• Clojure
• Haskell• Erlang• Scala• …
![Page 20: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/20.jpg)
20
Functional Reactive Programming - Мифы
3. Чтобы писать вфункциональномстиле, обязательноизучить ииспользовать: Монады
Моноиды
Функторы Лени
вые
вычи
слен
ияКа
ррир
ован
ие
Pattern
matching
Map/reduce/fold/merge
![Page 21: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/21.jpg)
21
Ленивые вычисления
Functional Reactive Programming – Особенности
b = 1;c = 2;a = b + c;b = 3;print(a); //?
Императивный подход(Java, C, C++, C#, JS)
3 5
Функциональный подход(Elm, Lisp, Haskel, Erlang)
![Page 22: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/22.jpg)
22
Ленивые вычисления
Functional Reactive Programming – Особенности
![Page 23: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/23.jpg)
23
Ленивые вычисления
Functional Reactive Programming – Особенности
Сколько будет 5 + 2 ?
7, профессор!
Похвально!@Testpublic void CorrectCalculateFivePlusTwo() { assertThat(5.plus(2), is(7));}
CorrectCalculateFivePlusTwo
![Page 24: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/24.jpg)
24
Ленивые вычисления
Functional Reactive Programming – Особенности
А сколько будет 5 + 3 ?
8, профессор!
Ставлю «неуд»!
![Page 25: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/25.jpg)
25
Ленивые вычисления
Functional Reactive Programming – Особенности
Кааааак???
А сколько?..
10
Потому что на предыдущем шаге «5» мы уже( 5.plus(2)) превратили в «7»!
@Testpublic void CorrectCalculateFivePlusThree() { assertThat(5.plus(2).plus(3), is(8));}
CorrectCalculateFivePlusThree
![Page 26: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/26.jpg)
26
ПЕРЕМЕННЫЕ
Functional Reactive Programming – Особенности
Императивный (ООП) подход Функциональный подходЧто есть река?
«Дважды невойти в одну иту же реку, ибопритекает другая вода.»
Геракли́т Эфе́сский,544—483 гг. до н. э.
@Mutablepublic class Река { private long state;
public long getState() { return state; }
public void setState(long state) { this.state = state; }}
![Page 27: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/27.jpg)
27
ПЕРЕМЕННЫЕ
Functional Reactive Programming – Особенности
![Page 28: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/28.jpg)
28
ПЕРЕМЕННЫЕ
Functional Reactive Programming – Особенности
![Page 29: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/29.jpg)
29
ПЕРЕМЕННЫЕ
Functional Reactive Programming – Особенности
Как, совсем без переменных???
public static int factorial(final int n) { if (n == 0) { return 1; } else { return n * factorial(n - 1); }}
![Page 30: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/30.jpg)
30
ПЕРЕМЕННЫЕ
Functional Reactive Programming – Особенности
![Page 31: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/31.jpg)
31
ЧИСТАЯ ФУНКЦИЯ
• Детерминированная• Нет side-effect`ов
Преимущества:• Кеширование• Удалённые вызовы• Параллельность выполнения
• Тестируемость
Functional Reactive Programming – Особенности
![Page 32: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/32.jpg)
32
ЧИСТАЯ ФУНКЦИЯ
Functional Reactive Programming – Особенности
public static int square(int x) { updateXToDb(x); return x * x;}
public static void squareAll(int... items) { for (int i = 0; i < items.length; i++) { items[i] = square(i); }}
![Page 33: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/33.jpg)
33
ЧИСТАЯ ФУНКЦИЯ
Functional Reactive Programming – Особенности
public static int square(int x) { return x * x;}
public static int[] squareAll(int... items) { return Arrays.stream(items) .map(operand -> square(operand)) .toArray();}
![Page 34: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/34.jpg)
34
ЧИСТАЯ ФУНКЦИЯ
Functional Reactive Programming – Особенности
public Program getCurrentProgram(TvGuide tvGuide, Chennel channel) {
Schedule schedule = tvGuide.getSchedule(channel); return schedule.programAt(new Date());}
![Page 35: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/35.jpg)
35
ЧИСТАЯ ФУНКЦИЯ
Functional Reactive Programming – Особенности
public Program getCurrentProgram(TvGuide tvGuide, Chennel channel, Date time) {
Schedule schedule = tvGuide.getSchedule(channel); return schedule.programAt(time);}
![Page 36: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/36.jpg)
36
Functional Reactive Programming – ОсобенностиАСИНХРОННОСТЬ
Синхронность Асинхронность
Взаимодействие Воздействие
Запрос Подписка на изменения
Ответ Получение уведомления
Генерация ID в БД INSERT со сгенерированным ID
HTTP POST HTTP GET
![Page 37: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/37.jpg)
37
BACK-END
Part 2
![Page 38: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/38.jpg)
38
Java SE 8 java.util.Optional
• Какой самый распространённый Exception в Java?
Back-end - Java SE 8 java.util.Optional
![Page 39: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/39.jpg)
39
Java SE 8 java.util.Optional
• Какой самый распространённый Exception в Java?– NullPointerException
• Как мы от него защищаемся?
Back-end - Java SE 8 java.util.Optional
![Page 40: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/40.jpg)
40
Java SE 8 java.util.Optional
• Какой самый распространённый Exception в Java?– NullPointerException
• Как мы от него защищаемся?– Проверки на null…
Back-end - Java SE 8 java.util.Optional
![Page 41: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/41.jpg)
41
Java SE 8 java.util.Optional
Back-end - Java SE 8 java.util.Optional
public String getUsersCityName() { User user = findUser(); if (user != null) { Address address = user.getAddress(); if (address != null) { String zipCode = address.getZipCode(); if (zipCode != null) { City city = findCityByZipCode(zipCode); if (city != null) return city.getName();}}} throw new RuntimeException();}
![Page 42: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/42.jpg)
42
Java SE 8 java.util.Optional
• Либо null, либо какой-то объект• Получение:
– Optional<Integer> integer = Optional.of(5);
– Optional<Object> empty = Optional.empty();
– Optional<Object> o = Optional.ofNullable(nullableFn());
Back-end - Java SE 8 java.util.Optional
![Page 43: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/43.jpg)
43
СЦЕНАРИИ ИСПОЛЬЗОВАНИЯ БЕЗ ВОЗВРАТА ЗНАЧЕНИЯ
• Примитивный сценарий:
Integer integer = getIntOptional().get();
Back-end - Java SE 8 java.util.Optional
![Page 44: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/44.jpg)
44
СЦЕНАРИИ ИСПОЛЬЗОВАНИЯ БЕЗ ВОЗВРАТА ЗНАЧЕНИЯ
• Сценарий получше:
Optional<Integer> optionalInt = getOptionalInt();if (optionalInt.isPresent()) { Integer integer = optionalInt.get(); // do something with integer variable}
Back-end - Java SE 8 java.util.Optional
![Page 45: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/45.jpg)
45
СЦЕНАРИИ ИСПОЛЬЗОВАНИЯ БЕЗ ВОЗВРАТА ЗНАЧЕНИЯ
• Ещё лучше:
Back-end - Java SE 8 java.util.Optional
getOptionalInt().ifPresent(integer -> // do something with integer variable);
![Page 46: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/46.jpg)
46
• Со значением: по умолчанию
Back-end - Java SE 8 java.util.Optional
ВАРИАНТЫ СЦЕНАРИЕВ С ВОЗВРАТОМ ЗНАЧЕНИЯ
Integer integer = getOptionalInt().orElseGet( new Supplier<Integer>() { @Override public Integer get() { return 0; } });
Integer integer = getOptionalInt().orElse(0);
![Page 47: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/47.jpg)
47
• Со значением: по умолчанию
Back-end - Java SE 8 java.util.Optional
ВАРИАНТЫ СЦЕНАРИЕВ С ВОЗВРАТОМ ЗНАЧЕНИЯ
Integer integer = getOptionalInt().orElseGet(() -> 0);
Integer integer = getOptionalInt().orElse(0);
![Page 48: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/48.jpg)
48
• С отсечением:
Back-end - Java SE 8 java.util.Optional
ВАРИАНТЫ СЦЕНАРИЕВ С ВОЗВРАТОМ ЗНАЧЕНИЯ
Integer integer = getOptionalInt().orElseThrow( () -> new RuntimeException("{some msg...}"));
// do something with integer variable
![Page 49: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/49.jpg)
49
ВАРИАНТЫ СЦЕНАРИЕВ С ВОЗВРАТОМ ЗНАЧЕНИЯ
• С преобразованием и значением по умолчанию:
Back-end - Java SE 8 java.util.Optional
String s = getOptionalInt() .map(Integer::toHexString) .orElse("NaN");
// do something with s variable
![Page 50: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/50.jpg)
50
ВАРИАНТЫ СЦЕНАРИЕВ С ВОЗВРАТОМ ЗНАЧЕНИЯ
• С фильтрацией, преобразованием и значением по умолчанию:
Back-end - Java SE 8 java.util.Optional
String s = getOptionalInt() .filter(integer -> integer > 0 && integer < 100) .map(Integer::toHexString) .orElse("NaN");
// do something with s variable
![Page 51: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/51.jpg)
51
ВАРИАНТЫ СЦЕНАРИЕВ С ВОЗВРАТОМ ЗНАЧЕНИЯ
String s = getOptionalInt() .filter(integer -> integer > 0 && integer < 100) .map(Integer::toHexString) .flatMap(s1 -> getOptionalString().map(s2 -> s1 + s1)) .orElse("NaN");
// do something with s variable
• С фильтрацией, преобразованием и значением по умолчанию:
Back-end - Java SE 8 java.util.Optional
![Page 52: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/52.jpg)
52
ВАРИАНТЫ СЦЕНАРИЕВ С ВОЗВРАТОМ ЗНАЧЕНИЯ
• Считать сразу два свойства из property-файла и вывести рез-т на консоль лишь в случае, если они оба заданы:
Back-end - Java SE 8 java.util.Optional
Properties properties = new Properties();properties.load(new FileInputStream("props.properties"));
ofNullable(properties.getProperty("key")) .flatMap(key -> ofNullable(properties.getProperty("value")) .map(value -> key + " = " + value)) .ifPresent(System.out::println);
![Page 53: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/53.jpg)
53
Функциональные интерфейсы
• Только один абстрактный (без реализации) метод– => можно реализовывать при помощи лямбд
• Для самоконтроля полезно ставить аннотацию @FunctionalInterface
• Есть достаточно много предопределённых• Почти все дублируются для типов int, double, long
Back-end - Java SE 8 Stream API
![Page 54: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/54.jpg)
54
Функциональные интерфейсы
•Runnable { void run(); }
Back-end - Java SE 8 Stream API
![Page 55: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/55.jpg)
55
Функциональные интерфейсы
•Callable<V> { V call() throws Exception; }– Supplier<T> { T get(); }
Back-end - Java SE 8 Stream API
![Page 56: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/56.jpg)
56
Функциональные интерфейсы
•Consumer<T> { void accept(T t); }– BiConsumer<T, U> { void accept(T t, U u); }
Back-end - Java SE 8 Stream API
![Page 57: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/57.jpg)
57
Функциональные интерфейсы
•Function<T, R> { R apply(T t); }– UnaryOperator<T> extends Function<T, T>– BiFunction<T, U, R> { R apply(T t, U u); }
• BinaryOperator<T> extends BiFunction<T,T,T>– Predicate<T> { boolean test(T t); }
• BiPredicate<T, U> { boolean test(T t, U u); }
Back-end - Java SE 8 Stream API
![Page 58: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/58.jpg)
58
java.util.stream.Stream<T>
•Абстракция потока данных•«Внутреннее» итерирование•«Декларативная параллельность»
Back-end - Java SE 8 Stream API
![Page 59: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/59.jpg)
59
Back-end - Java SE 8 Stream API
java.util.stream.Stream<T>
long count = 0L;for (Artist artist : allArtists) { if (artist.isFrom("Moscow")) { count++; }}
long count = allArtists.stream() .parallel() .filter(artist -> artist.isFrom(“Moscow")) .count();
ArrayDeque<Artist> allArtists;
![Page 60: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/60.jpg)
60
Back-end - Java SE 8 Stream API
filter
![Page 61: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/61.jpg)
61
Back-end - Java SE 8 Stream API
map
![Page 62: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/62.jpg)
62
Back-end - Java SE 8 Stream API
flatMap
![Page 63: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/63.jpg)
63
Back-end - Java SE 8 Stream API
reduce
![Page 64: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/64.jpg)
64
Back-end - Java SE 8 Rx
А как же интеграция?
![Page 65: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/65.jpg)
65
Rx Basics
• ReactiveX – это комбинация Observer pattern, Iterator pattern, functional programming
• Вдохновлена «reactive manifesto»( http://www.reactivemanifesto.org ):
– Отзывчивые (responsive)– Отказоустойчивые (resilient)– Масштабируемые (elastic)– Ориентированные на события (message-driven)системы
Back-end - Java SE 8 Rx
Эрик Мейер
![Page 66: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/66.jpg)
66
Rx basics
• Subscriber (Observer) подписывается на Observable• Observable вызывает методы Subscriber`а:
– onNext(T) – доступен следующий элемент– onError(Throwable) – произошла ошибка– onCompleted() – поток удачно завершился
• Subscriber обрабатывает соответствующие вызовы.• Контракт - порядок вызова методов должен быть следующий:
– onNext(T)*, onError(Throwable) | onCompleted()
Back-end - Java SE 8 Rx
![Page 67: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/67.jpg)
67
Rx basics
•Простейший способ создания Observable`а:– Observable.just(5);
Back-end - Java SE 8 Rx
![Page 68: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/68.jpg)
68
Rx basics
• Подписываемся и обрабатываем входящие значения:– Observable.just(5) .subscribe(integer -> System.out.println(integer));
Back-end - Java SE 8 Rx
![Page 69: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/69.jpg)
69
Rx basics
• Подписываемся и обрабатываем входящие значения:– Observable.just(5) .subscribe(System.out::println, throwable ->
System.err.println(throwable));
Back-end - Java SE 8 Rx
![Page 70: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/70.jpg)
70
Rx basics
• Подписываемся и обрабатываем входящие значения:– Observable.just(5) .subscribe(System.out::println, System.err::println, () -> System.out.println("Completed!"));
Back-end - Java SE 8 Rx
![Page 71: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/71.jpg)
71
Rx basics
• Подписываемся и обрабатываем входящие значения:– Observable.just(5, 4, 3, 2, 1) .subscribe(System.out::println, System.err::println, () -> System.out.println("Completed!"));
Back-end - Java SE 8 Rx
![Page 72: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/72.jpg)
72
Rx basics
• Создаём Observable из вызовов соотв. методов Subscriber`а:– Observable.create(subscriber -> {
subscriber.onNext(5); subscriber.onNext(4); subscriber.onNext(3); subscriber.onNext(2); subscriber.onNext(1); subscriber.onCompleted();}).subscribe(System.out::println, System.err::println, () -> System.out.println("Completed!"));
Back-end - Java SE 8 Rx
![Page 73: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/73.jpg)
73
Rx basics
• Создаём Observable из вызовов соотв. методов Subscriber`а:– Observable.timer(15, TimeUnit.SECONDS) .subscribe(System.out::println, System.err::println, () -> System.out.println("Completed!"));
Back-end - Java SE 8 Rx
![Page 74: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/74.jpg)
74
Rx basics
Создаём Observable из вызовов соотв. методов Subscriber`а:• final Iterable<Integer> integers = Arrays.asList(5, 4, 3, 2, 1);Observable.from(integers) .subscribe(System.out::println, System.err::println, () -> System.out.println("Completed!"));
Back-end - Java SE 8 Rx
![Page 75: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/75.jpg)
75
Back-end – marble diagrams
http://rxmarbles.com
![Page 76: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/76.jpg)
76
Back-end
![Page 77: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/77.jpg)
77
Back-end
![Page 78: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/78.jpg)
78
А как же существующие интеграционные решения?
Back-end - Java SE 8 RxJava + Apache Camel
![Page 79: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/79.jpg)
79
•Маршруты (Routes) можно конфигурировать– статически (например, в файле Spring-контекста)– во время работы приложения.
Back-end - Java SE 8 RxJava + Apache CamelОсновы Apache Camel
![Page 80: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/80.jpg)
80
•По маршрутам ходят караваны сообщений, попутно попадая в различные
– обработчики,– конверторы,– агрегаторы,– прочие трансформеры
Back-end - Java SE 8 RxJava + Apache CamelОсновы Apache Camel
![Page 81: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/81.jpg)
81
Back-end - Java SE 8 RxJava + Apache CamelОсновы Apache Camel
public static void main(String... args) throws Exception { CamelContext context = Route.set( FILE_FROM_URI, fromRoute -> fromRoute .process(CamelExample::process) .to(FILE_TO_URI));
context.start(); Thread.sleep(10_000); context.stop();}
private static void process(Exchange exchange) { System.out.println( "Найден и загружен файл: " + exchange.getIn().getHeaders().entrySet().stream() .map(Object::toString) .collect(Collectors.joining("\n")));}
![Page 82: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/82.jpg)
82
Back-end - Java SE 8 RxJava + Apache CamelCamel RX
ReactiveCamel rx = new ReactiveCamel(context);Observable<Order> observable = rx.toObservable("seda:orders", Order.class);
Observable<String> largeOrderIds = observable .filter(order -> order.getAmount() > 100.0) .map(Order::getId);
http://camel.apache.org/rx
![Page 83: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/83.jpg)
83
Back-end - Speedmentmysql> explain hare;+-------+-------------+------+-----+---------+----------------+| Field | Type | Null | Key | Default | Extra |+-------+-------------+------+-----+---------+----------------+| id | int(11) | NO | PRI | NULL | auto_increment || name | varchar(45) | NO | | NULL | || color | varchar(45) | NO | | NULL | || age | int(11) | NO | | NULL | |+-------+-------------+------+-----+---------+----------------+4 rows in set (0.01 sec)
List<Hare> oldHares = hares.stream() .filter(AGE.greaterThan(8)) .collect(toList());
long noOldHares = hares.stream() .filter(AGE.greaterThan(8)) .mapToInt(Hare::getAge) .sorted() .count();
![Page 84: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/84.jpg)
84
Back-end - Speedment
![Page 85: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/85.jpg)
85
FRONT-END
Part 3
![Page 86: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/86.jpg)
86
Functional Reactive Programming – Redux
![Page 87: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/87.jpg)
87
Functional Reactive Programming - RxJS
/* With an interval time */var source = Rx.Observable.interval(1000) .sample(5000) .take(2);
var subscription = source.subscribe( function (x) { console.log('Next: ' + x); }, function (err) { console.log('Error: ' + err); }, function () { console.log('Completed'); });
![Page 88: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/88.jpg)
88
Functional Reactive Programming - Рекомендации
Р.Уорбертон«Лямбда-выражения в Java 8»
Р.Филдб П.Харрисон«Функциональное программирование»
![Page 89: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/89.jpg)
89
THANKYOU
![Page 90: Functional reactive full stack development in java/js (JPoint ed.)](https://reader036.fdocuments.in/reader036/viewer/2022062316/58f0b9431a28ab557f8b45fb/html5/thumbnails/90.jpg)
90
CONTACT ME
selavy
Vyacheslav Lapin
Vseslavur