Top Banner
Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant Backpressure TweetStream 1/47 Confusing Concurrency RxJava in Action Moritz Richter, Tim Wedde Enterprise System Whatever FH Techniek en Logistiek Venlo May 6, 2018
47

Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant

May 20, 2020

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant

ConfusingConcurrency

Moritz Richter,Tim Wedde

Intro

RxJava

Streams in Java 8+

Functional Progr.

Stream Operators

Task: Donald’sRestaurant

Backpressure

TweetStream

1/47

Confusing ConcurrencyRxJava in Action

Moritz Richter, Tim Wedde

Enterprise System Whatever

FH Techniek en LogistiekVenlo

May 6, 2018

Page 2: Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant

ConfusingConcurrency

Moritz Richter,Tim Wedde

Intro

RxJava

Streams in Java 8+

Functional Progr.

Stream Operators

Task: Donald’sRestaurant

Backpressure

TweetStream

2/47

What is RxJava?

Page 3: Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant

ConfusingConcurrency

Moritz Richter,Tim Wedde

Intro

RxJava

Streams in Java 8+

Functional Progr.

Stream Operators

Task: Donald’sRestaurant

Backpressure

TweetStream

3/47

Types of Concurrency

Page 4: Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant

ConfusingConcurrency

Moritz Richter,Tim Wedde

Intro

RxJava

Streams in Java 8+

Functional Progr.

Stream Operators

Task: Donald’sRestaurant

Backpressure

TweetStream

4/47

Types of Concurrency

Page 5: Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant

ConfusingConcurrency

Moritz Richter,Tim Wedde

Intro

RxJava

Streams in Java 8+

Functional Progr.

Stream Operators

Task: Donald’sRestaurant

Backpressure

TweetStream

5/47

Types of Concurrency

Page 6: Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant

ConfusingConcurrency

Moritz Richter,Tim Wedde

Intro

RxJava

Streams in Java 8+

Functional Progr.

Stream Operators

Task: Donald’sRestaurant

Backpressure

TweetStream

6/47

Types of Concurrency

Page 7: Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant

ConfusingConcurrency

Moritz Richter,Tim Wedde

Intro

RxJava

Streams in Java 8+

Functional Progr.

Stream Operators

Task: Donald’sRestaurant

Backpressure

TweetStream

7/47

Sequential Processing

try:

for item in collection:

onNext() -> doWithAndWaitFor(item)

except Exception e:

onError() -> panic(e)

onComplete() -> cleanup()

Page 8: Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant

ConfusingConcurrency

Moritz Richter,Tim Wedde

Intro

RxJava

Streams in Java 8+

Functional Progr.

Stream Operators

Task: Donald’sRestaurant

Backpressure

TweetStream

8/47

Types of Concurrency

Page 9: Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant

ConfusingConcurrency

Moritz Richter,Tim Wedde

Intro

RxJava

Streams in Java 8+

Functional Progr.

Stream Operators

Task: Donald’sRestaurant

Backpressure

TweetStream

9/47

Callback Hell

Page 10: Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant

ConfusingConcurrency

Moritz Richter,Tim Wedde

Intro

RxJava

Streams in Java 8+

Functional Progr.

Stream Operators

Task: Donald’sRestaurant

Backpressure

TweetStream

10/47

Callback Hell - Dante’s Inferno

Page 11: Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant

ConfusingConcurrency

Moritz Richter,Tim Wedde

Intro

RxJava

Streams in Java 8+

Functional Progr.

Stream Operators

Task: Donald’sRestaurant

Backpressure

TweetStream

11/47

Observer to the Rescue!

Page 12: Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant

ConfusingConcurrency

Moritz Richter,Tim Wedde

Intro

RxJava

Streams in Java 8+

Functional Progr.

Stream Operators

Task: Donald’sRestaurant

Backpressure

TweetStream

12/47

RxJava Observables

Event Iterable Observable

retrieve data T next() onNext(T)

discover error throws Ex. onError(Ex.)

complete !hasNext() onCompleted()

Page 13: Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant

ConfusingConcurrency

Moritz Richter,Tim Wedde

Intro

RxJava

Streams in Java 8+

Functional Progr.

Stream Operators

Task: Donald’sRestaurant

Backpressure

TweetStream

13/47

What is RxJava?

RxJava’s objective is to work on discretevalues that are emitted over time

(streams), using a push-basedarchitecture.

→ Reactive Programming ←

Page 14: Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant

ConfusingConcurrency

Moritz Richter,Tim Wedde

Intro

RxJava

Streams in Java 8+

Functional Progr.

Stream Operators

Task: Donald’sRestaurant

Backpressure

TweetStream

14/47

Streams in Java 8+

List<String> myList =

Arrays.asList("a1", "a2", "b1", "c2", "c1");

myList

.stream()

.filter(s -> s.startsWith("c"))

.map(String::toUpperCase)

.sorted()

.forEach(System.out::println);

Page 15: Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant

ConfusingConcurrency

Moritz Richter,Tim Wedde

Intro

RxJava

Streams in Java 8+

Functional Progr.

Stream Operators

Task: Donald’sRestaurant

Backpressure

TweetStream

15/47

Streams in Java 8+

I Pull-based

I Single-Use, no forking or reusing

I No merging

I No time-based operations

Page 16: Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant

ConfusingConcurrency

Moritz Richter,Tim Wedde

Intro

RxJava

Streams in Java 8+

Functional Progr.

Stream Operators

Task: Donald’sRestaurant

Backpressure

TweetStream

16/47

Back to the [Completable]Future?

CompletableFuture<String> helloText =

CompletableFuture.supplyAsync(() -> {

TimeUnit.SECONDS.sleep(1);

return "World";

}).thenApply(name -> {

return "Hello, " + name + "!";

}).thenApply(text -> {

return text + " This is callback chaining!";

});

System.out.println(helloText.get());

Page 17: Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant

ConfusingConcurrency

Moritz Richter,Tim Wedde

Intro

RxJava

Streams in Java 8+

Functional Progr.

Stream Operators

Task: Donald’sRestaurant

Backpressure

TweetStream

17/47

Functional Programming

I No side effects

I No mutating state

I Arbitrary data

Page 18: Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant

ConfusingConcurrency

Moritz Richter,Tim Wedde

Intro

RxJava

Streams in Java 8+

Functional Progr.

Stream Operators

Task: Donald’sRestaurant

Backpressure

TweetStream

18/47

concat()

Page 19: Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant

ConfusingConcurrency

Moritz Richter,Tim Wedde

Intro

RxJava

Streams in Java 8+

Functional Progr.

Stream Operators

Task: Donald’sRestaurant

Backpressure

TweetStream

19/47

merge()

Page 20: Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant

ConfusingConcurrency

Moritz Richter,Tim Wedde

Intro

RxJava

Streams in Java 8+

Functional Progr.

Stream Operators

Task: Donald’sRestaurant

Backpressure

TweetStream

20/47

map()

Page 21: Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant

ConfusingConcurrency

Moritz Richter,Tim Wedde

Intro

RxJava

Streams in Java 8+

Functional Progr.

Stream Operators

Task: Donald’sRestaurant

Backpressure

TweetStream

21/47

filter()

Page 22: Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant

ConfusingConcurrency

Moritz Richter,Tim Wedde

Intro

RxJava

Streams in Java 8+

Functional Progr.

Stream Operators

Task: Donald’sRestaurant

Backpressure

TweetStream

22/47

concatMap()

Page 23: Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant

ConfusingConcurrency

Moritz Richter,Tim Wedde

Intro

RxJava

Streams in Java 8+

Functional Progr.

Stream Operators

Task: Donald’sRestaurant

Backpressure

TweetStream

23/47

flatMap()

Page 24: Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant

ConfusingConcurrency

Moritz Richter,Tim Wedde

Intro

RxJava

Streams in Java 8+

Functional Progr.

Stream Operators

Task: Donald’sRestaurant

Backpressure

TweetStream

24/47

reduce()

Page 25: Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant

ConfusingConcurrency

Moritz Richter,Tim Wedde

Intro

RxJava

Streams in Java 8+

Functional Progr.

Stream Operators

Task: Donald’sRestaurant

Backpressure

TweetStream

25/47

sum()

Page 26: Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant

ConfusingConcurrency

Moritz Richter,Tim Wedde

Intro

RxJava

Streams in Java 8+

Functional Progr.

Stream Operators

Task: Donald’sRestaurant

Backpressure

TweetStream

26/47

scan()

Page 27: Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant

ConfusingConcurrency

Moritz Richter,Tim Wedde

Intro

RxJava

Streams in Java 8+

Functional Progr.

Stream Operators

Task: Donald’sRestaurant

Backpressure

TweetStream

27/47

Task: Donald’s Restaurant

Page 28: Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant

ConfusingConcurrency

Moritz Richter,Tim Wedde

Intro

RxJava

Streams in Java 8+

Functional Progr.

Stream Operators

Task: Donald’sRestaurant

Backpressure

TweetStream

28/47

A short recap

1. Orders are submitted as strings in the format:“<meal number>, <servings>”

2. Requests for meals are Lists that contain 1 to n Orders

3. Order strings are split at the comma and used toconstruct a new Order object

4. All Orders from one Request are put into an OrderLineobject

5. All Orders in a Request are assigned an increasing indexas the order number

6. Orders are turned into Meals while waiting for a timespecified in its recipe

Page 29: Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant

ConfusingConcurrency

Moritz Richter,Tim Wedde

Intro

RxJava

Streams in Java 8+

Functional Progr.

Stream Operators

Task: Donald’sRestaurant

Backpressure

TweetStream

29/47

Task: Donald’s Restaurant

I Download the zipped project from the workshoprepository

I Open the project in Netbeans or IntelliJ

I Open the class Main.java

https://git.io/vFPQB

http://reactivex.io/documentation/operators

RxJava GitHub wiki: https://git.io/vWHZx

Original Restaurant: https://git.io/vFPby

Page 30: Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant

ConfusingConcurrency

Moritz Richter,Tim Wedde

Intro

RxJava

Streams in Java 8+

Functional Progr.

Stream Operators

Task: Donald’sRestaurant

Backpressure

TweetStream

30/47

Task: Donald’s Restaurant

Create a stream of order strings and print them

Page 31: Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant

ConfusingConcurrency

Moritz Richter,Tim Wedde

Intro

RxJava

Streams in Java 8+

Functional Progr.

Stream Operators

Task: Donald’sRestaurant

Backpressure

TweetStream

31/47

Task: Donald’s Restaurant

Parse the order strings into Orders and putthem into OrderLines, then print those

Page 32: Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant

ConfusingConcurrency

Moritz Richter,Tim Wedde

Intro

RxJava

Streams in Java 8+

Functional Progr.

Stream Operators

Task: Donald’sRestaurant

Backpressure

TweetStream

32/47

Task: Donald’s Restaurant

Transform every Order in an OrderLine into aMeal and print it

Page 33: Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant

ConfusingConcurrency

Moritz Richter,Tim Wedde

Intro

RxJava

Streams in Java 8+

Functional Progr.

Stream Operators

Task: Donald’sRestaurant

Backpressure

TweetStream

33/47

Task: Donald’s Restaurant

Filter out invalid Orders, based on checkingtheir recipe number

Handle exceptions by skipping invalid items

Page 34: Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant

ConfusingConcurrency

Moritz Richter,Tim Wedde

Intro

RxJava

Streams in Java 8+

Functional Progr.

Stream Operators

Task: Donald’sRestaurant

Backpressure

TweetStream

34/47

Task: Donald’s Restaurant

Add an incrementing order number to eachnew OrderLine

Page 35: Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant

ConfusingConcurrency

Moritz Richter,Tim Wedde

Intro

RxJava

Streams in Java 8+

Functional Progr.

Stream Operators

Task: Donald’sRestaurant

Backpressure

TweetStream

35/47

Task: Donald’s Restaurant

Page 36: Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant

ConfusingConcurrency

Moritz Richter,Tim Wedde

Intro

RxJava

Streams in Java 8+

Functional Progr.

Stream Operators

Task: Donald’sRestaurant

Backpressure

TweetStream

36/47

Task: Donald’s Restaurant

Page 37: Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant

ConfusingConcurrency

Moritz Richter,Tim Wedde

Intro

RxJava

Streams in Java 8+

Functional Progr.

Stream Operators

Task: Donald’sRestaurant

Backpressure

TweetStream

37/47

Task: Donald’s Restaurant

Go multi-threaded by using parallel()

Page 38: Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant

ConfusingConcurrency

Moritz Richter,Tim Wedde

Intro

RxJava

Streams in Java 8+

Functional Progr.

Stream Operators

Task: Donald’sRestaurant

Backpressure

TweetStream

38/47

Backpressure

Hot vs Cold Observables

Page 39: Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant

ConfusingConcurrency

Moritz Richter,Tim Wedde

Intro

RxJava

Streams in Java 8+

Functional Progr.

Stream Operators

Task: Donald’sRestaurant

Backpressure

TweetStream

39/47

Backpressure

I Cold: Emit on subscribe(), starting from the beginning

I Hot: Emit constantly, subscribers “tune” in and out

Page 40: Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant

ConfusingConcurrency

Moritz Richter,Tim Wedde

Intro

RxJava

Streams in Java 8+

Functional Progr.

Stream Operators

Task: Donald’sRestaurant

Backpressure

TweetStream

40/47

Backpressure Strategies

I Error: Signals a MissingBackpressureException.

Page 41: Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant

ConfusingConcurrency

Moritz Richter,Tim Wedde

Intro

RxJava

Streams in Java 8+

Functional Progr.

Stream Operators

Task: Donald’sRestaurant

Backpressure

TweetStream

41/47

Backpressure Strategies

I Buffer: Buffers all onNext values.

Page 42: Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant

ConfusingConcurrency

Moritz Richter,Tim Wedde

Intro

RxJava

Streams in Java 8+

Functional Progr.

Stream Operators

Task: Donald’sRestaurant

Backpressure

TweetStream

42/47

Backpressure Strategies

I Drop: Drops the most recent onNext value.

Page 43: Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant

ConfusingConcurrency

Moritz Richter,Tim Wedde

Intro

RxJava

Streams in Java 8+

Functional Progr.

Stream Operators

Task: Donald’sRestaurant

Backpressure

TweetStream

43/47

Backpressure Strategies

I Latest: Keeps only the latest onNext value, overwritingany previous value.

Page 44: Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant

ConfusingConcurrency

Moritz Richter,Tim Wedde

Intro

RxJava

Streams in Java 8+

Functional Progr.

Stream Operators

Task: Donald’sRestaurant

Backpressure

TweetStream

44/47

Backpressure Strategies

I Missing: OnNext events are written without anybuffering or dropping.

Page 45: Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant

ConfusingConcurrency

Moritz Richter,Tim Wedde

Intro

RxJava

Streams in Java 8+

Functional Progr.

Stream Operators

Task: Donald’sRestaurant

Backpressure

TweetStream

45/47

TweetStream

Page 46: Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant

ConfusingConcurrency

Moritz Richter,Tim Wedde

Intro

RxJava

Streams in Java 8+

Functional Progr.

Stream Operators

Task: Donald’sRestaurant

Backpressure

TweetStream

46/47

TweetStream

I Download the zipped project from the workshoprepository

I Open the project in Netbeans or IntelliJ

I Open the class Main.java

https://git.io/vFPQ8

http://reactivex.io/documentation/operators

Page 47: Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant

ConfusingConcurrency

Moritz Richter,Tim Wedde

Sources

47/47

Sources I

Chris FroussiosIntro to RxJavahttps://git.io/vFocj

Andre StaltzThe introduction to Reactive Programming you’ve beenmissinghttps://git.io/bMkl

ReactiveX DocumentationOperators & Getting Startedhttp://reactivex.io/documentation

RxJava Workshop 2017https://git.io/vFEId