SlideShare a Scribd company logo
1 of 67
Download to read offline
Artur Glier
RxJava – Reactive Extensions for the JVM – a library for
composing asynchronous and event-based programs using
observable sequences for the Java VM
✓ Microsoft Reactive Extensions by Erik Meijer
Fast forward
✓ Microsoft Reactive Extensions by Erik Meijer
✓ Netflix RxJava & RxJs by Ben Christensen
Fast forward
✓ Microsoft Reactive Extensions by Erik Meijer
✓ Netflix RxJava & RxJs by Ben Christensen
✓ Github ReactiveCocoa
Fast forward
✓ Microsoft Reactive Extensions by Erik Meijer
✓ Netflix RxJava & RxJs by Ben Christensen
✓ Github ReactiveCocoa (Think different...)
Fast forward
Some of early adopters
RxJava is all about FRP
✓ Programming with
asynchronous data streams
FRP is...
✓ Programming with
asynchronous data streams
+
✓ Toolbox
FRP is...
✓ Cross platform ;)
✓ A fun new tool. “If you only have a hammer -
you tend to see each problem as nail.”
✓ Less error prone
✓ ! a steep learning curve
FRP is...
@interface RACSignal (Operations)
- (RACSignal *)doNext:(void (^)(id x))block;
- (RACSignal *)doError:(void (^)(NSError *error))block;
- (RACSignal *)doCompleted:(void (^)(void))block;
- (RACSignal *)throttle:(NSTimeInterval)interval;
- (RACSignal *)throttle:(NSTimeInterval)interval valuesPassingTest:(BOOL (^)(id next))predicate;
- (RACSignal *)delay:(NSTimeInterval)interval;
- (RACSignal *)repeat;
- (RACSignal *)initially:(void (^)(void))block;
- (RACSignal *)finally:(void (^)(void))block;
- (RACSignal *)bufferWithTime:(NSTimeInterval)interval onScheduler:(RACScheduler *)scheduler;
- (RACSignal *)collect;
- (RACSignal *)takeLast:(NSUInteger)count;
- (RACSignal *)combineLatestWith:(RACSignal *)signal;
+ (RACSignal *)combineLatest:(id<NSFastEnumeration>)signals;
+ (RACSignal *)combineLatest:(id<NSFastEnumeration>)signals reduce:(id (^)())reduceBlock;
- (RACSignal *)merge:(RACSignal *)signal;
+ (RACSignal *)merge:(id<NSFastEnumeration>)signals;
- (RACSignal *)flatten:(NSUInteger)maxConcurrent;
...
@end
RxJava is an extension of the
observer desing pattern
It’s pull-based approach and any logic
requires the result to be available at
execution time
Iterables
Futures are straight-forward to use for a
single level of asynchronous execution
Conditional asynchronous execution flows
become difficult to optimally compose
Futures
They are easy to use with a single level of
asynchronous execution but become
unwieldy with nested composition.
Callbacks
Producer can signal consumer that there is
no more data available
Producer can signal consumer that error has
ocurred
Observer Pattern
How do you learn RxJava?
BY example
RxJava is all about FRP
FRP is...
✓ Responsive, Reslient,
Elastic, Message Driven
“FRP manifesto”
✓ Rx = Observables + LINQ + Schedulers
“Microsoft”
✓ Programming paradigm for reactive programming using
the building blocks of functional programming
“Wikipedia”
✓ … “stackoverflow”
FRP is...
✓ Responsive, Reslient,
Elastic, Message Driven
“FRP manifesto”
✓ Rx = Observables + LINQ + Schedulers
“Microsoft”
✓ Programming paradigm for reactive programming using
the building blocks of functional programming
“Wikipedia”
✓ … “stackoverflow”
FRP is...
✓ Responsive, Reslient,
Elastic, Message Driven
“FRP manifesto”
✓ Rx = Observables + LINQ + Schedulers
“Microsoft”
✓ Programming paradigm for reactive programming using
the building blocks of functional programming
“Wikipedia”
✓ … “stackoverflow”
FRP is...
✓ Responsive, Reslient,
Elastic, Message Driven
“FRP manifesto”
✓ Rx = Observables + LINQ + Schedulers
“Microsoft”
✓ Programming paradigm for reactive programming using
the building blocks of functional programming
“Wikipedia”
✓ … “stackoverflow”
FRP is...
✓ Responsive, Reslient,
Elastic, Message Driven
“FRP manifesto”
✓ Rx = Observables + LINQ + Schedulers
“Microsoft”
✓ Programming paradigm for reactive programming using
the building blocks of functional programming
“Wikipedia”
✓ … “stackoverflow”
Bla, bla,
bla...
Rx.Observable.prototype
.flatMapLatest(selector, [thisArg])
Projects each element of an observable sequence into a new
sequence of observable sequences by incorporating the element's
index and then transforms an observable sequence of observable
sequences into an observable sequence producing values only from
the most recent observable sequence.
BY example
RxJava is all about marbles
Not this kind of marbles
This kind of marbles
RxJava is all about code
Observable<String> observable = Observable.just("Hello, World!");
Subscriber<String> subscriber = new Subscriber<String>() {
@Override
public void onCompleted() {
// code here
}
@Override
public void onError(Throwable e) {
// code here
}
@Override
public void onNext(String s) {
output.append(String.format("%sn", s));
}
};
@Override
protected void onStart() {
super.onStart();
observable
.observeOn(Schedulers.newThread())
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe(subscriber);
}
Request composition
public interface AftonbladetAPI {
@GET("/item/{id}.json")
Observable<Item> item(@Path("id") long id);
@GET("/topstories.json")
Observable<List<Long>> topStories();
}
Request composition
GET /topstories
[ 8414149, 8414078, 8413972, 8411638, 8414102, 8413204, 8413100, 8413971,
8412744, 8414003, 8412841, 8412802, 8412605, 8413548, 8413123, 8414437,
8412897, 8413028, 8413341, 8412425, 8411762, 8413623, 8412346, 8411356,
8413056, 8413365, 8412372, 8414055, 8412877, 8412167, 8413264, 8414137,
8410519, 8412933, 8411846, 8412929, 8411254, 8411512, 8412777, 8412626,
8413274, 8414389, 8414117, 8412114, 8412212, 8412759, 8412696, 8412768,
8411643, 8411866, 8413966, 8410976, 8410545, 8410358, 8413979, 8414129,
8411791, 8409075, 8410314, 8411532, 8411553, 8412099, 8412085, 8410356,
8409084, 8412862, 8409823, 8412705, 8410220, 8409323, 8414090, 8410326 ]
Request composition
GET item/8863.json
{
"by": "Daniel Söderbäck",
"id": 1,
"score": 111,
"time": 1415793648,
"title": "Swede Jacobson won the Poker World Championships",
"type": "story",
"url": "http://www.aftonbladet.se/sportbladet/poker/article19844615.ab"
}
Request composition
public void onRefresh() {
Aftonbladet.API.topStories()
.flatMap(longs -> Observable.from(longs))
.flatMap(id -> Aftonbladet.API.item(id))
.collect(new ArrayList<Item>(), (items, item) -> items.add(item))
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(...);
}
Request composition - flatMap()
public void onRefresh() {
Aftonbladet.API.topStories()
.flatMap(longs -> Observable.from(longs))
.flatMap(id -> Aftonbladet.API.item(id))
.collect(new ArrayList<Item>(), (items, item) -> items.add(item))
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(...);
}
Request composition - flatMap()
public void onRefresh() {
Aftonbladet.API.topStories()
.flatMap(longs -> Observable.from(longs))
.flatMap(id -> Aftonbladet.API.item(id))
.collect(new ArrayList<Item>(), (items, item) -> items.add(item))
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(...);
}
Request composition - collect()
public void onRefresh() {
Aftonbladet.API.topStories()
.flatMap(longs -> Observable.from(longs))
.flatMap(id -> Aftonbladet.API.item(id))
.collect(new ArrayList<Item>(), (items, item) -> items.add(item))
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(...);
}
Request composition - threads
public void onRefresh() {
Aftonbladet.API.topStories()
.flatMap(longs -> Observable.from(longs))
.flatMap(id -> Aftonbladet.API.item(id))
.collect(new ArrayList<Item>(), (items, item) -> items.add(item))
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(...);
}
Request composition
public void onRefresh() {
Aftonbladet.API.topStories()
.flatMap(longs -> Observable.from(longs))
.flatMap(id -> Aftonbladet.API.item(id))
.collect(new ArrayList<Item>(), (items, item) -> items.add(item))
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(...);
}
Request composition
.subscribe(
items -> list.setAdapter(new ArrayAdapter<Item>(..., ..., items)),
error -> handleError(error),
() -> {
if (ptr.isRefreshing()) ptr.setRefreshing(false);
}
)
Request composition - filter()
public void onRefresh() {
HackerNews.API.topStories()
.flatMap(longs -> Observable.from(longs))
.flatMap(id -> HackerNews.API.item(id))
.filter(item -> item.time > 1412985600)
.collect(new ArrayList<Item>(), (items, item) -> items.add(item))
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(...);
}
Request composition - limit()
public void onRefresh() {
HackerNews.API.topStories()
.flatMap(longs -> Observable.from(longs))
.flatMap(id -> HackerNews.API.item(id))
.filter(item -> item.time > 1412985600)
.limit(10)
.collect(new ArrayList<Item>(), (items, item) -> items.add(item))
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(...);
}
Request composition
Observable.zip(
service.getUserPhoto(id),
service.getPhotoMetadata(id),
(photo, metadata) -> createPhotoWithData(photo, metadata))
.subscribe(photoWithData -> showPhoto(photoWithData));
public static Observable<String> getRegIdObservable(final Context context) {
return Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
try {
subscriber.onNext(getDeviceRegId(context));
subscriber.onCompleted();
} catch (Exception e) {
subscriber.onError(e);
}
}
});
}
GcmUtils.getRegIdObservable(this)
.subscribeOn(Schedulers.newThread())
.observeOn(Schedulers.newThread())
.subscribe(new Action1<Topic>() {
@Override
public void call(Topic topic) {
API.subscribeToTopic(/* ... */);
}
});
RxJava is all about fun
✓ https://gist.github.
com/vizZ/9756d2e2450a7ef9f744
Any advice?
Questions?
artur.glier@schibsted.pl
Refactoring Android to RxJava

More Related Content

Viewers also liked

W poszukiwaniu procesu doskonałego. Wdrożenie Scruma, Continuous Integrations...
W poszukiwaniu procesu doskonałego. Wdrożenie Scruma, Continuous Integrations...W poszukiwaniu procesu doskonałego. Wdrożenie Scruma, Continuous Integrations...
W poszukiwaniu procesu doskonałego. Wdrożenie Scruma, Continuous Integrations...3camp
 
Jak udokumentować bazę danych
Jak udokumentować bazę danychJak udokumentować bazę danych
Jak udokumentować bazę danych3camp
 
HTTPS bez wymówek
HTTPS bez wymówekHTTPS bez wymówek
HTTPS bez wymówek3camp
 
ORM - tuningujemy podejście do mapowania
ORM - tuningujemy podejście do mapowaniaORM - tuningujemy podejście do mapowania
ORM - tuningujemy podejście do mapowania3camp
 
Kompresja stron internetowych – omówienie technik redukujących rozmiar serwis...
Kompresja stron internetowych – omówienie technik redukujących rozmiar serwis...Kompresja stron internetowych – omówienie technik redukujących rozmiar serwis...
Kompresja stron internetowych – omówienie technik redukujących rozmiar serwis...3camp
 
Jak pokochac uwiesc i porzucic bankowca
Jak pokochac uwiesc i porzucic bankowca Jak pokochac uwiesc i porzucic bankowca
Jak pokochac uwiesc i porzucic bankowca 3camp
 
,,Zamek" czy ,,gwiazda" ?
,,Zamek" czy ,,gwiazda" ?,,Zamek" czy ,,gwiazda" ?
,,Zamek" czy ,,gwiazda" ?3camp
 
Od pomysłu do biznesu
Od pomysłu do biznesuOd pomysłu do biznesu
Od pomysłu do biznesu3camp
 
Łukasz Spandel – Atena – JavaScript rośnie w siłę – najnowsze trendy w tworze...
Łukasz Spandel – Atena – JavaScript rośnie w siłę – najnowsze trendy w tworze...Łukasz Spandel – Atena – JavaScript rośnie w siłę – najnowsze trendy w tworze...
Łukasz Spandel – Atena – JavaScript rośnie w siłę – najnowsze trendy w tworze...3camp
 
Pióro cyfrowe. Inteligentne ale… pracowite
Pióro cyfrowe. Inteligentne ale… pracowitePióro cyfrowe. Inteligentne ale… pracowite
Pióro cyfrowe. Inteligentne ale… pracowite3camp
 
Tworzenie wydajnych aplikacji na platformę Windows Phone
Tworzenie wydajnych aplikacji na platformę Windows PhoneTworzenie wydajnych aplikacji na platformę Windows Phone
Tworzenie wydajnych aplikacji na platformę Windows Phone3camp
 
Flipped Clasroom – praktyczne wykorzystanie wad i zalet technologii w nauczan...
Flipped Clasroom – praktyczne wykorzystanie wad i zalet technologii w nauczan...Flipped Clasroom – praktyczne wykorzystanie wad i zalet technologii w nauczan...
Flipped Clasroom – praktyczne wykorzystanie wad i zalet technologii w nauczan...3camp
 
Artur Senk, OKE Poland, Big Data na zakupach
Artur Senk, OKE Poland, Big Data na zakupachArtur Senk, OKE Poland, Big Data na zakupach
Artur Senk, OKE Poland, Big Data na zakupach3camp
 
Z zubibu.com po Polsce i Europie
Z zubibu.com po Polsce i EuropieZ zubibu.com po Polsce i Europie
Z zubibu.com po Polsce i Europie3camp
 
Czy obrazki z podróży mogą stać się inspiracją na e-biznes?
Czy obrazki z podróży mogą stać się inspiracją na e-biznes?Czy obrazki z podróży mogą stać się inspiracją na e-biznes?
Czy obrazki z podróży mogą stać się inspiracją na e-biznes?3camp
 
Webinarowy biznes
Webinarowy biznesWebinarowy biznes
Webinarowy biznes3camp
 
MongoDB dla administratora
MongoDB dla administratora MongoDB dla administratora
MongoDB dla administratora 3camp
 
Now Blob Job
Now Blob JobNow Blob Job
Now Blob Jobcrevates
 

Viewers also liked (20)

W poszukiwaniu procesu doskonałego. Wdrożenie Scruma, Continuous Integrations...
W poszukiwaniu procesu doskonałego. Wdrożenie Scruma, Continuous Integrations...W poszukiwaniu procesu doskonałego. Wdrożenie Scruma, Continuous Integrations...
W poszukiwaniu procesu doskonałego. Wdrożenie Scruma, Continuous Integrations...
 
Jak udokumentować bazę danych
Jak udokumentować bazę danychJak udokumentować bazę danych
Jak udokumentować bazę danych
 
HTTPS bez wymówek
HTTPS bez wymówekHTTPS bez wymówek
HTTPS bez wymówek
 
ORM - tuningujemy podejście do mapowania
ORM - tuningujemy podejście do mapowaniaORM - tuningujemy podejście do mapowania
ORM - tuningujemy podejście do mapowania
 
Kompresja stron internetowych – omówienie technik redukujących rozmiar serwis...
Kompresja stron internetowych – omówienie technik redukujących rozmiar serwis...Kompresja stron internetowych – omówienie technik redukujących rozmiar serwis...
Kompresja stron internetowych – omówienie technik redukujących rozmiar serwis...
 
Jak pokochac uwiesc i porzucic bankowca
Jak pokochac uwiesc i porzucic bankowca Jak pokochac uwiesc i porzucic bankowca
Jak pokochac uwiesc i porzucic bankowca
 
,,Zamek" czy ,,gwiazda" ?
,,Zamek" czy ,,gwiazda" ?,,Zamek" czy ,,gwiazda" ?
,,Zamek" czy ,,gwiazda" ?
 
Od pomysłu do biznesu
Od pomysłu do biznesuOd pomysłu do biznesu
Od pomysłu do biznesu
 
Łukasz Spandel – Atena – JavaScript rośnie w siłę – najnowsze trendy w tworze...
Łukasz Spandel – Atena – JavaScript rośnie w siłę – najnowsze trendy w tworze...Łukasz Spandel – Atena – JavaScript rośnie w siłę – najnowsze trendy w tworze...
Łukasz Spandel – Atena – JavaScript rośnie w siłę – najnowsze trendy w tworze...
 
Pióro cyfrowe. Inteligentne ale… pracowite
Pióro cyfrowe. Inteligentne ale… pracowitePióro cyfrowe. Inteligentne ale… pracowite
Pióro cyfrowe. Inteligentne ale… pracowite
 
Tworzenie wydajnych aplikacji na platformę Windows Phone
Tworzenie wydajnych aplikacji na platformę Windows PhoneTworzenie wydajnych aplikacji na platformę Windows Phone
Tworzenie wydajnych aplikacji na platformę Windows Phone
 
Flipped Clasroom – praktyczne wykorzystanie wad i zalet technologii w nauczan...
Flipped Clasroom – praktyczne wykorzystanie wad i zalet technologii w nauczan...Flipped Clasroom – praktyczne wykorzystanie wad i zalet technologii w nauczan...
Flipped Clasroom – praktyczne wykorzystanie wad i zalet technologii w nauczan...
 
Artur Senk, OKE Poland, Big Data na zakupach
Artur Senk, OKE Poland, Big Data na zakupachArtur Senk, OKE Poland, Big Data na zakupach
Artur Senk, OKE Poland, Big Data na zakupach
 
Z zubibu.com po Polsce i Europie
Z zubibu.com po Polsce i EuropieZ zubibu.com po Polsce i Europie
Z zubibu.com po Polsce i Europie
 
Czy obrazki z podróży mogą stać się inspiracją na e-biznes?
Czy obrazki z podróży mogą stać się inspiracją na e-biznes?Czy obrazki z podróży mogą stać się inspiracją na e-biznes?
Czy obrazki z podróży mogą stać się inspiracją na e-biznes?
 
Webinarowy biznes
Webinarowy biznesWebinarowy biznes
Webinarowy biznes
 
MongoDB dla administratora
MongoDB dla administratora MongoDB dla administratora
MongoDB dla administratora
 
Now Blob Job
Now Blob JobNow Blob Job
Now Blob Job
 
Nov presentation to RIES & Partners
Nov presentation to RIES & PartnersNov presentation to RIES & Partners
Nov presentation to RIES & Partners
 
Blob Job
Blob JobBlob Job
Blob Job
 

Similar to Learn you some rx for the greater good

Not Only Streams for Akademia JLabs
Not Only Streams for Akademia JLabsNot Only Streams for Akademia JLabs
Not Only Streams for Akademia JLabsKonrad Malawski
 
Practicing at the Cutting Edge: Learning and Unlearning about Java Performance
Practicing at the Cutting Edge: Learning and Unlearning about Java PerformancePracticing at the Cutting Edge: Learning and Unlearning about Java Performance
Practicing at the Cutting Edge: Learning and Unlearning about Java PerformanceC4Media
 
Practicing at the Cutting Edge
Practicing at the Cutting EdgePracticing at the Cutting Edge
Practicing at the Cutting EdgeC4Media
 
Ehtsham Elahi, Senior Research Engineer, Personalization Science and Engineer...
Ehtsham Elahi, Senior Research Engineer, Personalization Science and Engineer...Ehtsham Elahi, Senior Research Engineer, Personalization Science and Engineer...
Ehtsham Elahi, Senior Research Engineer, Personalization Science and Engineer...MLconf
 
The Cloud-natives are RESTless @ JavaOne
The Cloud-natives are RESTless @ JavaOneThe Cloud-natives are RESTless @ JavaOne
The Cloud-natives are RESTless @ JavaOneKonrad Malawski
 
Voxxed Days Vienna - The Why and How of Reactive Web-Applications on the JVM
Voxxed Days Vienna - The Why and How of Reactive Web-Applications on the JVMVoxxed Days Vienna - The Why and How of Reactive Web-Applications on the JVM
Voxxed Days Vienna - The Why and How of Reactive Web-Applications on the JVMManuel Bernhardt
 
MLconf seattle 2015 presentation
MLconf seattle 2015 presentationMLconf seattle 2015 presentation
MLconf seattle 2015 presentationehtshamelahi
 
JavaScript For People Who Don't Code
JavaScript For People Who Don't CodeJavaScript For People Who Don't Code
JavaScript For People Who Don't CodeChristopher Schmitt
 
Attack monitoring using ElasticSearch Logstash and Kibana
Attack monitoring using ElasticSearch Logstash and KibanaAttack monitoring using ElasticSearch Logstash and Kibana
Attack monitoring using ElasticSearch Logstash and KibanaPrajal Kulkarni
 
LarKC Tutorial at ISWC 2009 - Introduction
LarKC Tutorial at ISWC 2009 - IntroductionLarKC Tutorial at ISWC 2009 - Introduction
LarKC Tutorial at ISWC 2009 - IntroductionLarKC
 
How Reactive Streams & Akka Streams change the JVM Ecosystem
How Reactive Streams & Akka Streams change the JVM EcosystemHow Reactive Streams & Akka Streams change the JVM Ecosystem
How Reactive Streams & Akka Streams change the JVM EcosystemKonrad Malawski
 
Intro to Elasticsearch and Kibana.pdf
Intro to Elasticsearch and Kibana.pdfIntro to Elasticsearch and Kibana.pdf
Intro to Elasticsearch and Kibana.pdfssuser65fa31
 
Reactive Web-Applications @ LambdaDays
Reactive Web-Applications @ LambdaDaysReactive Web-Applications @ LambdaDays
Reactive Web-Applications @ LambdaDaysManuel Bernhardt
 
Microservices and Teraflops: Effortlessly Scaling Data Science with PyWren wi...
Microservices and Teraflops: Effortlessly Scaling Data Science with PyWren wi...Microservices and Teraflops: Effortlessly Scaling Data Science with PyWren wi...
Microservices and Teraflops: Effortlessly Scaling Data Science with PyWren wi...Databricks
 
The elastic stack on docker
The elastic stack on dockerThe elastic stack on docker
The elastic stack on dockerSmartWave
 
End to End Akka Streams / Reactive Streams - from Business to Socket
End to End Akka Streams / Reactive Streams - from Business to SocketEnd to End Akka Streams / Reactive Streams - from Business to Socket
End to End Akka Streams / Reactive Streams - from Business to SocketKonrad Malawski
 
Spark Summit EU talk by Sameer Agarwal
Spark Summit EU talk by Sameer AgarwalSpark Summit EU talk by Sameer Agarwal
Spark Summit EU talk by Sameer AgarwalSpark Summit
 

Similar to Learn you some rx for the greater good (20)

Not Only Streams for Akademia JLabs
Not Only Streams for Akademia JLabsNot Only Streams for Akademia JLabs
Not Only Streams for Akademia JLabs
 
Practicing at the Cutting Edge: Learning and Unlearning about Java Performance
Practicing at the Cutting Edge: Learning and Unlearning about Java PerformancePracticing at the Cutting Edge: Learning and Unlearning about Java Performance
Practicing at the Cutting Edge: Learning and Unlearning about Java Performance
 
Practicing at the Cutting Edge
Practicing at the Cutting EdgePracticing at the Cutting Edge
Practicing at the Cutting Edge
 
Ehtsham Elahi, Senior Research Engineer, Personalization Science and Engineer...
Ehtsham Elahi, Senior Research Engineer, Personalization Science and Engineer...Ehtsham Elahi, Senior Research Engineer, Personalization Science and Engineer...
Ehtsham Elahi, Senior Research Engineer, Personalization Science and Engineer...
 
The Cloud-natives are RESTless @ JavaOne
The Cloud-natives are RESTless @ JavaOneThe Cloud-natives are RESTless @ JavaOne
The Cloud-natives are RESTless @ JavaOne
 
Voxxed Days Vienna - The Why and How of Reactive Web-Applications on the JVM
Voxxed Days Vienna - The Why and How of Reactive Web-Applications on the JVMVoxxed Days Vienna - The Why and How of Reactive Web-Applications on the JVM
Voxxed Days Vienna - The Why and How of Reactive Web-Applications on the JVM
 
MLconf seattle 2015 presentation
MLconf seattle 2015 presentationMLconf seattle 2015 presentation
MLconf seattle 2015 presentation
 
JavaScript For People Who Don't Code
JavaScript For People Who Don't CodeJavaScript For People Who Don't Code
JavaScript For People Who Don't Code
 
Attack monitoring using ElasticSearch Logstash and Kibana
Attack monitoring using ElasticSearch Logstash and KibanaAttack monitoring using ElasticSearch Logstash and Kibana
Attack monitoring using ElasticSearch Logstash and Kibana
 
LarKC Tutorial at ISWC 2009 - Introduction
LarKC Tutorial at ISWC 2009 - IntroductionLarKC Tutorial at ISWC 2009 - Introduction
LarKC Tutorial at ISWC 2009 - Introduction
 
How Reactive Streams & Akka Streams change the JVM Ecosystem
How Reactive Streams & Akka Streams change the JVM EcosystemHow Reactive Streams & Akka Streams change the JVM Ecosystem
How Reactive Streams & Akka Streams change the JVM Ecosystem
 
Intro to Elasticsearch and Kibana.pdf
Intro to Elasticsearch and Kibana.pdfIntro to Elasticsearch and Kibana.pdf
Intro to Elasticsearch and Kibana.pdf
 
Reactive Web-Applications @ LambdaDays
Reactive Web-Applications @ LambdaDaysReactive Web-Applications @ LambdaDays
Reactive Web-Applications @ LambdaDays
 
Microservices and Teraflops: Effortlessly Scaling Data Science with PyWren wi...
Microservices and Teraflops: Effortlessly Scaling Data Science with PyWren wi...Microservices and Teraflops: Effortlessly Scaling Data Science with PyWren wi...
Microservices and Teraflops: Effortlessly Scaling Data Science with PyWren wi...
 
The elastic stack on docker
The elastic stack on dockerThe elastic stack on docker
The elastic stack on docker
 
End to End Akka Streams / Reactive Streams - from Business to Socket
End to End Akka Streams / Reactive Streams - from Business to SocketEnd to End Akka Streams / Reactive Streams - from Business to Socket
End to End Akka Streams / Reactive Streams - from Business to Socket
 
Not only SQL
Not only SQL Not only SQL
Not only SQL
 
Spark devoxx2014
Spark devoxx2014Spark devoxx2014
Spark devoxx2014
 
ConSol_IBM_webcast_quarkus_the_blue_hedgehog_of_java_web_frameworks
ConSol_IBM_webcast_quarkus_the_blue_hedgehog_of_java_web_frameworksConSol_IBM_webcast_quarkus_the_blue_hedgehog_of_java_web_frameworks
ConSol_IBM_webcast_quarkus_the_blue_hedgehog_of_java_web_frameworks
 
Spark Summit EU talk by Sameer Agarwal
Spark Summit EU talk by Sameer AgarwalSpark Summit EU talk by Sameer Agarwal
Spark Summit EU talk by Sameer Agarwal
 

More from 3camp

Ochrona podatnych webaplikacji za pomocą wirtualnych poprawek
Ochrona podatnych webaplikacji za pomocą wirtualnych poprawekOchrona podatnych webaplikacji za pomocą wirtualnych poprawek
Ochrona podatnych webaplikacji za pomocą wirtualnych poprawek3camp
 
No pressure, no diamonds. Rzecz o łamaniu zasad w projektach.
No pressure, no diamonds. Rzecz o łamaniu zasad w projektach.No pressure, no diamonds. Rzecz o łamaniu zasad w projektach.
No pressure, no diamonds. Rzecz o łamaniu zasad w projektach.3camp
 
Wykorzystanie języka Kotlin do aplikacji na platformie Android
Wykorzystanie języka Kotlin do aplikacji na platformie AndroidWykorzystanie języka Kotlin do aplikacji na platformie Android
Wykorzystanie języka Kotlin do aplikacji na platformie Android3camp
 
Google App Engine i Google Play Services w Twoich aplikacjach
Google App Engine i Google Play Services w Twoich aplikacjachGoogle App Engine i Google Play Services w Twoich aplikacjach
Google App Engine i Google Play Services w Twoich aplikacjach3camp
 
Reakcja łańcuchowa, czyli React.js w praktyce
Reakcja łańcuchowa, czyli React.js w praktyceReakcja łańcuchowa, czyli React.js w praktyce
Reakcja łańcuchowa, czyli React.js w praktyce3camp
 
Odtwarzanie multimediów w HTML5, czyli Player przez duże „P”
Odtwarzanie multimediów w HTML5, czyli Player przez duże „P”Odtwarzanie multimediów w HTML5, czyli Player przez duże „P”
Odtwarzanie multimediów w HTML5, czyli Player przez duże „P”3camp
 
AngularJS (nie) nadaje się do dużego projektu
AngularJS (nie) nadaje się do dużego projektuAngularJS (nie) nadaje się do dużego projektu
AngularJS (nie) nadaje się do dużego projektu3camp
 
Przemysław Bartkowiak - Sam ustalasz ile za to zapłacisz – czyli nowy wymiar ...
Przemysław Bartkowiak - Sam ustalasz ile za to zapłacisz – czyli nowy wymiar ...Przemysław Bartkowiak - Sam ustalasz ile za to zapłacisz – czyli nowy wymiar ...
Przemysław Bartkowiak - Sam ustalasz ile za to zapłacisz – czyli nowy wymiar ...3camp
 
Mirek Wąsowicz - Segment jednego, dokąd zmierza marketing online?
Mirek Wąsowicz - Segment jednego, dokąd zmierza marketing online?Mirek Wąsowicz - Segment jednego, dokąd zmierza marketing online?
Mirek Wąsowicz - Segment jednego, dokąd zmierza marketing online?3camp
 
Piotr Macuk, Konfeo.com, Programista i biznes – plusy i minusy własnej działa...
Piotr Macuk, Konfeo.com, Programista i biznes – plusy i minusy własnej działa...Piotr Macuk, Konfeo.com, Programista i biznes – plusy i minusy własnej działa...
Piotr Macuk, Konfeo.com, Programista i biznes – plusy i minusy własnej działa...3camp
 
Marcin Maj, Kainos - QA – wartko, zmiennie i interdyscyplinarnie
Marcin Maj, Kainos - QA – wartko, zmiennie i interdyscyplinarnieMarcin Maj, Kainos - QA – wartko, zmiennie i interdyscyplinarnie
Marcin Maj, Kainos - QA – wartko, zmiennie i interdyscyplinarnie3camp
 
Jak przesiąść się na rower na dwóch kółkach? Od trzyosobowego startupu do spó...
Jak przesiąść się na rower na dwóch kółkach? Od trzyosobowego startupu do spó...Jak przesiąść się na rower na dwóch kółkach? Od trzyosobowego startupu do spó...
Jak przesiąść się na rower na dwóch kółkach? Od trzyosobowego startupu do spó...3camp
 
Łukasz Brzeziński - Jak zarabiać z Wikingami? Czyli monetyzacja portalu inter...
Łukasz Brzeziński - Jak zarabiać z Wikingami? Czyli monetyzacja portalu inter...Łukasz Brzeziński - Jak zarabiać z Wikingami? Czyli monetyzacja portalu inter...
Łukasz Brzeziński - Jak zarabiać z Wikingami? Czyli monetyzacja portalu inter...3camp
 
Marcin Szeląg, InnovationNest, Startup Risk Model
Marcin Szeląg, InnovationNest, Startup Risk ModelMarcin Szeląg, InnovationNest, Startup Risk Model
Marcin Szeląg, InnovationNest, Startup Risk Model3camp
 
JSON, REST API
JSON, REST APIJSON, REST API
JSON, REST API3camp
 
Ostatnia faza produktu: co się dzieję kiedy programista zakończył swoje zadanie
Ostatnia faza produktu: co się dzieję kiedy programista zakończył swoje zadanieOstatnia faza produktu: co się dzieję kiedy programista zakończył swoje zadanie
Ostatnia faza produktu: co się dzieję kiedy programista zakończył swoje zadanie3camp
 
Oculus Rift – zanurzenie w przyszłość
Oculus Rift – zanurzenie w przyszłośćOculus Rift – zanurzenie w przyszłość
Oculus Rift – zanurzenie w przyszłość3camp
 
Druk 3d w służbie medycyny i przemysłu
 Druk 3d w służbie medycyny i przemysłu Druk 3d w służbie medycyny i przemysłu
Druk 3d w służbie medycyny i przemysłu3camp
 
Bitcoin – waluta globalna
Bitcoin – waluta globalnaBitcoin – waluta globalna
Bitcoin – waluta globalna3camp
 
Is social media next waste?
Is social media next waste?Is social media next waste?
Is social media next waste?3camp
 

More from 3camp (20)

Ochrona podatnych webaplikacji za pomocą wirtualnych poprawek
Ochrona podatnych webaplikacji za pomocą wirtualnych poprawekOchrona podatnych webaplikacji za pomocą wirtualnych poprawek
Ochrona podatnych webaplikacji za pomocą wirtualnych poprawek
 
No pressure, no diamonds. Rzecz o łamaniu zasad w projektach.
No pressure, no diamonds. Rzecz o łamaniu zasad w projektach.No pressure, no diamonds. Rzecz o łamaniu zasad w projektach.
No pressure, no diamonds. Rzecz o łamaniu zasad w projektach.
 
Wykorzystanie języka Kotlin do aplikacji na platformie Android
Wykorzystanie języka Kotlin do aplikacji na platformie AndroidWykorzystanie języka Kotlin do aplikacji na platformie Android
Wykorzystanie języka Kotlin do aplikacji na platformie Android
 
Google App Engine i Google Play Services w Twoich aplikacjach
Google App Engine i Google Play Services w Twoich aplikacjachGoogle App Engine i Google Play Services w Twoich aplikacjach
Google App Engine i Google Play Services w Twoich aplikacjach
 
Reakcja łańcuchowa, czyli React.js w praktyce
Reakcja łańcuchowa, czyli React.js w praktyceReakcja łańcuchowa, czyli React.js w praktyce
Reakcja łańcuchowa, czyli React.js w praktyce
 
Odtwarzanie multimediów w HTML5, czyli Player przez duże „P”
Odtwarzanie multimediów w HTML5, czyli Player przez duże „P”Odtwarzanie multimediów w HTML5, czyli Player przez duże „P”
Odtwarzanie multimediów w HTML5, czyli Player przez duże „P”
 
AngularJS (nie) nadaje się do dużego projektu
AngularJS (nie) nadaje się do dużego projektuAngularJS (nie) nadaje się do dużego projektu
AngularJS (nie) nadaje się do dużego projektu
 
Przemysław Bartkowiak - Sam ustalasz ile za to zapłacisz – czyli nowy wymiar ...
Przemysław Bartkowiak - Sam ustalasz ile za to zapłacisz – czyli nowy wymiar ...Przemysław Bartkowiak - Sam ustalasz ile za to zapłacisz – czyli nowy wymiar ...
Przemysław Bartkowiak - Sam ustalasz ile za to zapłacisz – czyli nowy wymiar ...
 
Mirek Wąsowicz - Segment jednego, dokąd zmierza marketing online?
Mirek Wąsowicz - Segment jednego, dokąd zmierza marketing online?Mirek Wąsowicz - Segment jednego, dokąd zmierza marketing online?
Mirek Wąsowicz - Segment jednego, dokąd zmierza marketing online?
 
Piotr Macuk, Konfeo.com, Programista i biznes – plusy i minusy własnej działa...
Piotr Macuk, Konfeo.com, Programista i biznes – plusy i minusy własnej działa...Piotr Macuk, Konfeo.com, Programista i biznes – plusy i minusy własnej działa...
Piotr Macuk, Konfeo.com, Programista i biznes – plusy i minusy własnej działa...
 
Marcin Maj, Kainos - QA – wartko, zmiennie i interdyscyplinarnie
Marcin Maj, Kainos - QA – wartko, zmiennie i interdyscyplinarnieMarcin Maj, Kainos - QA – wartko, zmiennie i interdyscyplinarnie
Marcin Maj, Kainos - QA – wartko, zmiennie i interdyscyplinarnie
 
Jak przesiąść się na rower na dwóch kółkach? Od trzyosobowego startupu do spó...
Jak przesiąść się na rower na dwóch kółkach? Od trzyosobowego startupu do spó...Jak przesiąść się na rower na dwóch kółkach? Od trzyosobowego startupu do spó...
Jak przesiąść się na rower na dwóch kółkach? Od trzyosobowego startupu do spó...
 
Łukasz Brzeziński - Jak zarabiać z Wikingami? Czyli monetyzacja portalu inter...
Łukasz Brzeziński - Jak zarabiać z Wikingami? Czyli monetyzacja portalu inter...Łukasz Brzeziński - Jak zarabiać z Wikingami? Czyli monetyzacja portalu inter...
Łukasz Brzeziński - Jak zarabiać z Wikingami? Czyli monetyzacja portalu inter...
 
Marcin Szeląg, InnovationNest, Startup Risk Model
Marcin Szeląg, InnovationNest, Startup Risk ModelMarcin Szeląg, InnovationNest, Startup Risk Model
Marcin Szeląg, InnovationNest, Startup Risk Model
 
JSON, REST API
JSON, REST APIJSON, REST API
JSON, REST API
 
Ostatnia faza produktu: co się dzieję kiedy programista zakończył swoje zadanie
Ostatnia faza produktu: co się dzieję kiedy programista zakończył swoje zadanieOstatnia faza produktu: co się dzieję kiedy programista zakończył swoje zadanie
Ostatnia faza produktu: co się dzieję kiedy programista zakończył swoje zadanie
 
Oculus Rift – zanurzenie w przyszłość
Oculus Rift – zanurzenie w przyszłośćOculus Rift – zanurzenie w przyszłość
Oculus Rift – zanurzenie w przyszłość
 
Druk 3d w służbie medycyny i przemysłu
 Druk 3d w służbie medycyny i przemysłu Druk 3d w służbie medycyny i przemysłu
Druk 3d w służbie medycyny i przemysłu
 
Bitcoin – waluta globalna
Bitcoin – waluta globalnaBitcoin – waluta globalna
Bitcoin – waluta globalna
 
Is social media next waste?
Is social media next waste?Is social media next waste?
Is social media next waste?
 

Recently uploaded

Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubKalema Edgar
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsMiki Katsuragi
 
Transcript: New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024BookNet Canada
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024Scott Keck-Warren
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsRizwan Syed
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Wonjun Hwang
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...shyamraj55
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Mattias Andersson
 
Bluetooth Controlled Car with Arduino.pdf
Bluetooth Controlled Car with Arduino.pdfBluetooth Controlled Car with Arduino.pdf
Bluetooth Controlled Car with Arduino.pdfngoud9212
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Enterprise Knowledge
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfAddepto
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
APIForce Zurich 5 April Automation LPDG
APIForce Zurich 5 April  Automation LPDGAPIForce Zurich 5 April  Automation LPDG
APIForce Zurich 5 April Automation LPDGMarianaLemus7
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr LapshynFwdays
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitecturePixlogix Infotech
 

Recently uploaded (20)

Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding Club
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping Elbows
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering Tips
 
Transcript: New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL Certs
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?
 
Bluetooth Controlled Car with Arduino.pdf
Bluetooth Controlled Car with Arduino.pdfBluetooth Controlled Car with Arduino.pdf
Bluetooth Controlled Car with Arduino.pdf
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdf
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
APIForce Zurich 5 April Automation LPDG
APIForce Zurich 5 April  Automation LPDGAPIForce Zurich 5 April  Automation LPDG
APIForce Zurich 5 April Automation LPDG
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC Architecture
 

Learn you some rx for the greater good

  • 2. RxJava – Reactive Extensions for the JVM – a library for composing asynchronous and event-based programs using observable sequences for the Java VM
  • 3.
  • 4.
  • 5. ✓ Microsoft Reactive Extensions by Erik Meijer Fast forward
  • 6. ✓ Microsoft Reactive Extensions by Erik Meijer ✓ Netflix RxJava & RxJs by Ben Christensen Fast forward
  • 7. ✓ Microsoft Reactive Extensions by Erik Meijer ✓ Netflix RxJava & RxJs by Ben Christensen ✓ Github ReactiveCocoa Fast forward
  • 8. ✓ Microsoft Reactive Extensions by Erik Meijer ✓ Netflix RxJava & RxJs by Ben Christensen ✓ Github ReactiveCocoa (Think different...) Fast forward
  • 9. Some of early adopters
  • 10. RxJava is all about FRP
  • 11. ✓ Programming with asynchronous data streams FRP is...
  • 12. ✓ Programming with asynchronous data streams + ✓ Toolbox FRP is...
  • 13. ✓ Cross platform ;) ✓ A fun new tool. “If you only have a hammer - you tend to see each problem as nail.” ✓ Less error prone ✓ ! a steep learning curve FRP is...
  • 14. @interface RACSignal (Operations) - (RACSignal *)doNext:(void (^)(id x))block; - (RACSignal *)doError:(void (^)(NSError *error))block; - (RACSignal *)doCompleted:(void (^)(void))block; - (RACSignal *)throttle:(NSTimeInterval)interval; - (RACSignal *)throttle:(NSTimeInterval)interval valuesPassingTest:(BOOL (^)(id next))predicate; - (RACSignal *)delay:(NSTimeInterval)interval; - (RACSignal *)repeat; - (RACSignal *)initially:(void (^)(void))block; - (RACSignal *)finally:(void (^)(void))block; - (RACSignal *)bufferWithTime:(NSTimeInterval)interval onScheduler:(RACScheduler *)scheduler; - (RACSignal *)collect; - (RACSignal *)takeLast:(NSUInteger)count; - (RACSignal *)combineLatestWith:(RACSignal *)signal; + (RACSignal *)combineLatest:(id<NSFastEnumeration>)signals; + (RACSignal *)combineLatest:(id<NSFastEnumeration>)signals reduce:(id (^)())reduceBlock; - (RACSignal *)merge:(RACSignal *)signal; + (RACSignal *)merge:(id<NSFastEnumeration>)signals; - (RACSignal *)flatten:(NSUInteger)maxConcurrent; ... @end
  • 15. RxJava is an extension of the observer desing pattern
  • 16.
  • 17.
  • 18. It’s pull-based approach and any logic requires the result to be available at execution time Iterables
  • 19. Futures are straight-forward to use for a single level of asynchronous execution Conditional asynchronous execution flows become difficult to optimally compose Futures
  • 20. They are easy to use with a single level of asynchronous execution but become unwieldy with nested composition. Callbacks
  • 21. Producer can signal consumer that there is no more data available Producer can signal consumer that error has ocurred Observer Pattern
  • 22. How do you learn RxJava?
  • 24. RxJava is all about FRP
  • 25. FRP is... ✓ Responsive, Reslient, Elastic, Message Driven “FRP manifesto” ✓ Rx = Observables + LINQ + Schedulers “Microsoft” ✓ Programming paradigm for reactive programming using the building blocks of functional programming “Wikipedia” ✓ … “stackoverflow”
  • 26. FRP is... ✓ Responsive, Reslient, Elastic, Message Driven “FRP manifesto” ✓ Rx = Observables + LINQ + Schedulers “Microsoft” ✓ Programming paradigm for reactive programming using the building blocks of functional programming “Wikipedia” ✓ … “stackoverflow”
  • 27. FRP is... ✓ Responsive, Reslient, Elastic, Message Driven “FRP manifesto” ✓ Rx = Observables + LINQ + Schedulers “Microsoft” ✓ Programming paradigm for reactive programming using the building blocks of functional programming “Wikipedia” ✓ … “stackoverflow”
  • 28. FRP is... ✓ Responsive, Reslient, Elastic, Message Driven “FRP manifesto” ✓ Rx = Observables + LINQ + Schedulers “Microsoft” ✓ Programming paradigm for reactive programming using the building blocks of functional programming “Wikipedia” ✓ … “stackoverflow”
  • 29. FRP is... ✓ Responsive, Reslient, Elastic, Message Driven “FRP manifesto” ✓ Rx = Observables + LINQ + Schedulers “Microsoft” ✓ Programming paradigm for reactive programming using the building blocks of functional programming “Wikipedia” ✓ … “stackoverflow” Bla, bla, bla...
  • 30. Rx.Observable.prototype .flatMapLatest(selector, [thisArg]) Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.
  • 31.
  • 33. RxJava is all about marbles
  • 34. Not this kind of marbles
  • 35. This kind of marbles
  • 36. RxJava is all about code
  • 37. Observable<String> observable = Observable.just("Hello, World!");
  • 38. Subscriber<String> subscriber = new Subscriber<String>() { @Override public void onCompleted() { // code here } @Override public void onError(Throwable e) { // code here } @Override public void onNext(String s) { output.append(String.format("%sn", s)); } };
  • 39. @Override protected void onStart() { super.onStart(); observable .observeOn(Schedulers.newThread()) .subscribeOn(AndroidSchedulers.mainThread()) .subscribe(subscriber); }
  • 40.
  • 41.
  • 42.
  • 43. Request composition public interface AftonbladetAPI { @GET("/item/{id}.json") Observable<Item> item(@Path("id") long id); @GET("/topstories.json") Observable<List<Long>> topStories(); }
  • 44. Request composition GET /topstories [ 8414149, 8414078, 8413972, 8411638, 8414102, 8413204, 8413100, 8413971, 8412744, 8414003, 8412841, 8412802, 8412605, 8413548, 8413123, 8414437, 8412897, 8413028, 8413341, 8412425, 8411762, 8413623, 8412346, 8411356, 8413056, 8413365, 8412372, 8414055, 8412877, 8412167, 8413264, 8414137, 8410519, 8412933, 8411846, 8412929, 8411254, 8411512, 8412777, 8412626, 8413274, 8414389, 8414117, 8412114, 8412212, 8412759, 8412696, 8412768, 8411643, 8411866, 8413966, 8410976, 8410545, 8410358, 8413979, 8414129, 8411791, 8409075, 8410314, 8411532, 8411553, 8412099, 8412085, 8410356, 8409084, 8412862, 8409823, 8412705, 8410220, 8409323, 8414090, 8410326 ]
  • 45. Request composition GET item/8863.json { "by": "Daniel Söderbäck", "id": 1, "score": 111, "time": 1415793648, "title": "Swede Jacobson won the Poker World Championships", "type": "story", "url": "http://www.aftonbladet.se/sportbladet/poker/article19844615.ab" }
  • 46. Request composition public void onRefresh() { Aftonbladet.API.topStories() .flatMap(longs -> Observable.from(longs)) .flatMap(id -> Aftonbladet.API.item(id)) .collect(new ArrayList<Item>(), (items, item) -> items.add(item)) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(...); }
  • 47. Request composition - flatMap() public void onRefresh() { Aftonbladet.API.topStories() .flatMap(longs -> Observable.from(longs)) .flatMap(id -> Aftonbladet.API.item(id)) .collect(new ArrayList<Item>(), (items, item) -> items.add(item)) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(...); }
  • 48. Request composition - flatMap() public void onRefresh() { Aftonbladet.API.topStories() .flatMap(longs -> Observable.from(longs)) .flatMap(id -> Aftonbladet.API.item(id)) .collect(new ArrayList<Item>(), (items, item) -> items.add(item)) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(...); }
  • 49. Request composition - collect() public void onRefresh() { Aftonbladet.API.topStories() .flatMap(longs -> Observable.from(longs)) .flatMap(id -> Aftonbladet.API.item(id)) .collect(new ArrayList<Item>(), (items, item) -> items.add(item)) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(...); }
  • 50. Request composition - threads public void onRefresh() { Aftonbladet.API.topStories() .flatMap(longs -> Observable.from(longs)) .flatMap(id -> Aftonbladet.API.item(id)) .collect(new ArrayList<Item>(), (items, item) -> items.add(item)) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(...); }
  • 51. Request composition public void onRefresh() { Aftonbladet.API.topStories() .flatMap(longs -> Observable.from(longs)) .flatMap(id -> Aftonbladet.API.item(id)) .collect(new ArrayList<Item>(), (items, item) -> items.add(item)) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(...); }
  • 52. Request composition .subscribe( items -> list.setAdapter(new ArrayAdapter<Item>(..., ..., items)), error -> handleError(error), () -> { if (ptr.isRefreshing()) ptr.setRefreshing(false); } )
  • 53.
  • 54. Request composition - filter() public void onRefresh() { HackerNews.API.topStories() .flatMap(longs -> Observable.from(longs)) .flatMap(id -> HackerNews.API.item(id)) .filter(item -> item.time > 1412985600) .collect(new ArrayList<Item>(), (items, item) -> items.add(item)) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(...); }
  • 55.
  • 56. Request composition - limit() public void onRefresh() { HackerNews.API.topStories() .flatMap(longs -> Observable.from(longs)) .flatMap(id -> HackerNews.API.item(id)) .filter(item -> item.time > 1412985600) .limit(10) .collect(new ArrayList<Item>(), (items, item) -> items.add(item)) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(...); }
  • 57.
  • 58. Request composition Observable.zip( service.getUserPhoto(id), service.getPhotoMetadata(id), (photo, metadata) -> createPhotoWithData(photo, metadata)) .subscribe(photoWithData -> showPhoto(photoWithData));
  • 59.
  • 60. public static Observable<String> getRegIdObservable(final Context context) { return Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { try { subscriber.onNext(getDeviceRegId(context)); subscriber.onCompleted(); } catch (Exception e) { subscriber.onError(e); } } }); }
  • 62.
  • 63. RxJava is all about fun
  • 66.