90
1 Functional Reactive full-stack development in Java&JS March 27, 2016

Functional reactive full stack development in java/js (JPoint ed.)

Embed Size (px)

Citation preview

Page 1: Functional reactive full stack development in java/js (JPoint ed.)

1

Functional Reactive full-stack development in Java&JSMarch 27, 2016

Page 2: Functional reactive full stack development in java/js (JPoint ed.)

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.)

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.)

4

FUNCTIONAL

Part 1

REACTIVEPROGRAMMING

Page 5: Functional reactive full stack development in java/js (JPoint ed.)

5

Functional Reactive Programming – Проблема

Гав? Мур? Иа? Ку-ка-ре-куу?

Page 6: Functional reactive full stack development in java/js (JPoint ed.)

6

Functional Reactive Programming – Проблема

Гордон Эрл Мур

«…количество транзисторов, размещаемых на кристалле интегральной схемы, удваивается каждые 24 месяца1»

Закон Мура1 Давид Хаус из Intel: «т.к. растёт ещё и быстродействие транзисторов, производительность процессоров должна удваиваться каждые 18 месяцев»

Page 7: Functional reactive full stack development in java/js (JPoint ed.)

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.)

8

Functional Reactive Programming – Проблема

Джин Амдал

«В случае, когда задача разделяется на несколько частей, суммарное время её выполнения на параллельной системе не может быть меньше времени выполнения самого длинного фрагмента, при условии одинаковой скорости всех вычислителей.»

Page 9: Functional reactive full stack development in java/js (JPoint ed.)

9

- число задействованных

независимых процессоров

Functional Reactive Programming – Проблема

Джин Амдал

- последовательная доля рассчётов- распараллеливаемая долярассчётов

Максимально-возможное ускорение, которое может быть получено на вычислительной системе из процессоров, по сравнению с однопроцессорным решением

Page 10: Functional reactive full stack development in java/js (JPoint ed.)

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.)

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.)

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.)

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.)

14

Приемущества

• Просто тестировать

Functional Reactive Programming – Определения

Page 15: Functional reactive full stack development in java/js (JPoint ed.)

15

Приемущества

• Просто тестировать• Меньше зависимостей

- проще читать.

Functional Reactive Programming – Определения

Page 16: Functional reactive full stack development in java/js (JPoint ed.)

16

Приемущества

• Просто тестировать• Меньше зависимостей -

проще читать.• Меньше ошибок

Functional Reactive Programming – Определения

Page 17: Functional reactive full stack development in java/js (JPoint ed.)

17

Приемущества

• Просто тестировать• Меньше зависимостей -

проще читать.• Меньше ошибок

Functional Reactive Programming – Определения

Недостатки

• Дольше (интереснее и сложнее) писать

Page 18: Functional reactive full stack development in java/js (JPoint ed.)

18

Functional Reactive Programming - Мифы

1. Функциональное программирование способен понять далеко не каждый…

Page 19: Functional reactive full stack development in java/js (JPoint ed.)

19

Functional Reactive Programming - Мифы

2. Писать в функциональном стиле можно лишь наtrue-функциональных языках!..

• Lisp• Clojure

• Haskell• Erlang• Scala• …

Page 20: Functional reactive full stack development in java/js (JPoint ed.)

20

Functional Reactive Programming - Мифы

3. Чтобы писать вфункциональномстиле, обязательноизучить ииспользовать: Монады

Моноиды

Функторы Лени

вые

вычи

слен

ияКа

ррир

ован

ие

Pattern

matching

Map/reduce/fold/merge

Page 21: Functional reactive full stack development in java/js (JPoint ed.)

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.)

22

Ленивые вычисления

Functional Reactive Programming – Особенности

Page 23: Functional reactive full stack development in java/js (JPoint ed.)

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.)

24

Ленивые вычисления

Functional Reactive Programming – Особенности

А сколько будет 5 + 3 ?

8, профессор!

Ставлю «неуд»!

Page 25: Functional reactive full stack development in java/js (JPoint ed.)

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.)

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.)

27

ПЕРЕМЕННЫЕ

Functional Reactive Programming – Особенности

Page 28: Functional reactive full stack development in java/js (JPoint ed.)

28

ПЕРЕМЕННЫЕ

Functional Reactive Programming – Особенности

Page 29: Functional reactive full stack development in java/js (JPoint ed.)

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.)

30

ПЕРЕМЕННЫЕ

Functional Reactive Programming – Особенности

Page 31: Functional reactive full stack development in java/js (JPoint ed.)

31

ЧИСТАЯ ФУНКЦИЯ

• Детерминированная• Нет side-effect`ов

Преимущества:• Кеширование• Удалённые вызовы• Параллельность выполнения

• Тестируемость

Functional Reactive Programming – Особенности

Page 32: Functional reactive full stack development in java/js (JPoint ed.)

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.)

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.)

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.)

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.)

36

Functional Reactive Programming – ОсобенностиАСИНХРОННОСТЬ

Синхронность Асинхронность

Взаимодействие Воздействие

Запрос Подписка на изменения

Ответ Получение уведомления

Генерация ID в БД INSERT со сгенерированным ID

HTTP POST HTTP GET

Page 37: Functional reactive full stack development in java/js (JPoint ed.)

37

BACK-END

Part 2

Page 38: Functional reactive full stack development in java/js (JPoint ed.)

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.)

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.)

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.)

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.)

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.)

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.)

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.)

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.)

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.)

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.)

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.)

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.)

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.)

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.)

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.)

53

Функциональные интерфейсы

• Только один абстрактный (без реализации) метод– => можно реализовывать при помощи лямбд

• Для самоконтроля полезно ставить аннотацию @FunctionalInterface

• Есть достаточно много предопределённых• Почти все дублируются для типов int, double, long

Back-end - Java SE 8 Stream API

Page 54: Functional reactive full stack development in java/js (JPoint ed.)

54

Функциональные интерфейсы

•Runnable { void run(); }

Back-end - Java SE 8 Stream API

Page 55: Functional reactive full stack development in java/js (JPoint ed.)

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.)

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.)

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.)

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.)

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.)

60

Back-end - Java SE 8 Stream API

filter

Page 61: Functional reactive full stack development in java/js (JPoint ed.)

61

Back-end - Java SE 8 Stream API

map

Page 62: Functional reactive full stack development in java/js (JPoint ed.)

62

Back-end - Java SE 8 Stream API

flatMap

Page 63: Functional reactive full stack development in java/js (JPoint ed.)

63

Back-end - Java SE 8 Stream API

reduce

Page 64: Functional reactive full stack development in java/js (JPoint ed.)

64

Back-end - Java SE 8 Rx

А как же интеграция?

Page 65: Functional reactive full stack development in java/js (JPoint ed.)

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.)

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.)

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.)

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.)

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.)

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.)

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.)

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.)

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.)

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.)

75

Back-end – marble diagrams

http://rxmarbles.com

Page 76: Functional reactive full stack development in java/js (JPoint ed.)

76

Back-end

Page 77: Functional reactive full stack development in java/js (JPoint ed.)

77

Back-end

Page 78: Functional reactive full stack development in java/js (JPoint ed.)

78

А как же существующие интеграционные решения?

Back-end - Java SE 8 RxJava + Apache Camel

Page 79: Functional reactive full stack development in java/js (JPoint ed.)

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.)

80

•По маршрутам ходят караваны сообщений, попутно попадая в различные

– обработчики,– конверторы,– агрегаторы,– прочие трансформеры

Back-end - Java SE 8 RxJava + Apache CamelОсновы Apache Camel

Page 81: Functional reactive full stack development in java/js (JPoint ed.)

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.)

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.)

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.)

84

Back-end - Speedment

Page 85: Functional reactive full stack development in java/js (JPoint ed.)

85

FRONT-END

Part 3

Page 86: Functional reactive full stack development in java/js (JPoint ed.)

86

Functional Reactive Programming – Redux

Page 87: Functional reactive full stack development in java/js (JPoint ed.)

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.)

88

Functional Reactive Programming - Рекомендации

Р.Уорбертон«Лямбда-выражения в Java 8»

Р.Филдб П.Харрисон«Функциональное программирование»

Page 89: Functional reactive full stack development in java/js (JPoint ed.)

89

THANKYOU

Page 90: Functional reactive full stack development in java/js (JPoint ed.)

90

CONTACT ME

selavy

Vyacheslav Lapin

Vseslavur