SlideShare une entreprise Scribd logo
1  sur  144
Télécharger pour lire hors ligne
An Introduction
to RxJava
Matt Dupree
mSearchView.setOnQueryTextListener(

new SearchView.OnQueryTextListener() {

@Override

public boolean onQueryTextSubmit(String s) {

mSearchView.clearFocus();

return true;

}



@Override

public boolean onQueryTextChange(String s) {

searchFor(s);

return true;

}

});
mSearchView.setOnQueryTextListener(

new SearchView.OnQueryTextListener() {

@Override

public boolean onQueryTextSubmit(String s) {

mSearchView.clearFocus();

return true;

}



@Override

public boolean onQueryTextChange(String s) {

searchFor(s);

return true;

}

});
private void searchFor(String query) {

// ANALYTICS EVENT: Start a search on the Search activity

// Contains: Nothing (Event params are constant: Search query 

// not included)

AnalyticsHelper.sendEvent(SCREEN_LABEL, "Search", "");

Bundle args = new Bundle(1);

if (query == null) {

query = "";

}

args.putString(ARG_QUERY, query);

if (TextUtils.equals(query, mQuery)) {

getLoaderManager()

.initLoader(SearchTopicsSessionsQuery.TOKEN, args,

this);

} else {

getLoaderManager()

.restartLoader(SearchTopicsSessionsQuery.TOKEN, args,

this);

}

mQuery = query;

}
private void searchFor(String query) {

// ANALYTICS EVENT: Start a search on the Search activity

// Contains: Nothing (Event params are constant: Search query 

// not included)

AnalyticsHelper.sendEvent(SCREEN_LABEL, "Search", "");

Bundle args = new Bundle(1);

if (query == null) {

query = "";

}

args.putString(ARG_QUERY, query);

if (TextUtils.equals(query, mQuery)) {

getLoaderManager()

.initLoader(SearchTopicsSessionsQuery.TOKEN, args,

this);

} else {

getLoaderManager()

.restartLoader(SearchTopicsSessionsQuery.TOKEN, args,

this);

}

mQuery = query;

}
@Override

public void onLoadFinished(Loader<Cursor> loader, Cursor data) {

mResultsAdapter.swapCursor(data);

mSearchResults.setVisibility(

data.getCount() > 0 ? View.VISIBLE : View.GONE);

}
we’re missing an
abstraction
Observable
declaratively
composable sequence
declaratively
composable sequence
declaratively
composable sequence
Observables in Action
I was pretty much dragged into RxJava by my coworkers...[RxJava]
was a lot like git...when I first learned git, I didn’t really learn it. I just
spent three weeks being mad at it...and then something clicked
and I was like ‘Oh! I get it! And this is amazing and I love it!' The
same thing happened with RxJava.
—Dan Lew, Google Developer Expert
Java’s
Array
Memory
Composition
Rx
Observable
Java’s
Array
Memory
Composition
Rx
Observable
Java’s
Array
Memory
Composition
Rx
Observable
Java’s
Array
Java’s
Iterable
Memory
Composition
Kotlin’s
Iterable;
Java 8
Streams
Rx
Observable
Java’s
Array
Java’s
Iterable
Memory
Composition
Kotlin’s
Iterable;
Java 8
Streams
Rx
Observable
Java’s
Array
Java’s
Iterable
Memory
Composition
Kotlin’s
Iterable;
Java 8
Streams
Rx
Observable
Java’s
Array
Java’s
Iterable
Memory
Composition
Kotlin’s
Iterable;
Java 8
Streams
Rx
Observable
Java’s
Array
Java’s
Iterable
Memory
Composition
Kotlin’s
Iterable;
Java 8
Streams
Rx
Observable
???
???
declaratively
composable sequence
declaratively
composable sequence
Java’s
Array
Java’s
Iterable
Memory
Composition
Kotlin’s
Iterable;
Java 8
Streams
Rx
Observable
Java’s
Array
Java’s
Iterable
Memory
Composition
Kotlin’s
Iterable;
Java 8
Streams
Rx
Observable
Javascript’s
Array
Java’s
Array
Java’s
Iterable
Memory
Composition
Kotlin’s
Iterable;
Java 8
Streams
Rx
Observable
Javascript’s
Array
declaratively
composable array
imperatively
composable array
Java’s
Array
Java’s
Iterable
Memory
Composition
Kotlin’s
Iterable;
Java 8
Streams
Rx
Observable
Javascript’s
Array
Country[] northAmericanCountries = { 

new Country("United States", 300e6),

new Country("Canada", 36e6),

new Country("Mexico", 127e6),

//...

};
double[] getPopulations(Country[] counties) {

double[] populations = new double[counties.length];

for (int i = 0; i < counties.length; i++) {

populations[i] = counties[i].getPopulation();

}

return populations;

}
double[] getPopulations(Country[] counties) {

double[] populations = new double[counties.length];

for (int i = 0; i < counties.length; i++) {

populations[i] = counties[i].getPopulation();

}

return populations;

}
double[] getPopulations(Country[] counties) {

double[] populations = new double[counties.length];

for (int i = 0; i < counties.length; i++) {

populations[i] = counties[i].getPopulation();

}

return populations;

}
double[] getPopulations(Country[] counties) {

double[] populations = new double[counties.length];

for (int i = 0; i < counties.length; i++) {

populations[i] = counties[i].getPopulation();

}

return populations;

}
Java’s
Array
Java’s
Iterable
Memory
Composition
Kotlin’s
Iterable;
Java 8
Streams
Rx
Observable
Javascript’s
Array
Java’s
Array
Java’s
Iterable
Memory
Composition
Kotlin’s
Iterable;
Java 8
Streams
Rx
Observable
Javascript’s
Array
const countries = [
{ name: "United States", population: 300e6 },
{ name: "Canada", population: 36e6 },
{ name: "Mexico", population: 107e6 }
];
const getPopulations
= (countries) => countries.map(it => it.population);
class Array {
map(transform) {
const newList = [];
for (let i = 0; i < this.size; i++) {
newList.push(transform(this[i]));
}
return newList;
}
}
map
map
filter
map
filter
reduce
const northAmericanPopExcludingUs = countries
.filter(it => it.name === "United States")
.map(it => it.population)
.reduce((totalPop, countryPop) => totalPop + countryPop);
const northAmericanPopExcludingUs = countries
.filter(it => it.name === "United States")
.map(it => it.population)
.reduce((totalPop, countryPop) => totalPop + countryPop);
const northAmericanPopExcludingUs = countries
.filter(it => it.name === "United States")
.map(it => it.population)
.reduce((totalPop, countryPop) => totalPop + countryPop);
const northAmericanPopExcludingUs = countries
.filter(it => it.name === "United States")
.map(it => it.population)
.reduce((totalPop, countryPop) => totalPop + countryPop);
const northAmericanPopExcludingUs = countries
.filter(it => it.name === "United States")
.map(it => it.population)
.reduce((totalPop, countryPop) => totalPop + countryPop);
const northAmericanPopExcludingUs = countries
.filter(it => it.name === "United States")
.map(it => it.population)
.reduce((totalPop, countryPop) => totalPop + countryPop);
300e6 + 36e6 + 127e6 + …
declaratively
composable array
Java’s
Array
Java’s
Iterable
Memory
Composition
Kotlin’s
Iterable;
Java 8
Streams
Rx
Observable
Javascript’s
Array
map
filter
reduce
map
filter
reduce
+ LinkedList
map
filter
reduce
+ LinkedList = 💥
How is the sequence
stored in memory?
Java’s
Array
Java’s
Iterable
Memory
Composition
Kotlin’s
Iterable;
Java 8
Streams
Rx
Observable
Javascript’s
Array
Java’s
Array
Java’s
Iterable
Memory
Composition
Kotlin’s
Iterable;
Java 8
Streams
Rx
Observable
Javascript’s
Array
Array
Array LinkedList
Array LinkedList
Iterable
Country[] northAmericanCountries = { 

new Country("United States", 300e6),

new Country("Canada", 36e6),

new Country("Mexico", 127e6),

//...

};
for (int i = 0; i < northAmericanCountries.length; i++) {

System.out.println(northAmericanCountries[i]);

}
for (int i = 0; i < linkedList.length; i++) {

System.out.println(linkedList[i]);

}
for (final Object object : array) {

System.out.println(object);

}
for (final Object object : linkedList) {

System.out.println(object);

}
for (final Object object : iterable) {

System.out.println(object);

}
How is the sequence
stored in memory?
Java’s
Array
Java’s
Iterable
Memory
Composition
Kotlin’s
Iterable;
Java 8
Streams
Rx
Observable
Javascript’s
Array
Java’s
Array
Java’s
Iterable
Memory
Composition
Kotlin’s
Iterable;
Java 8
Streams
Rx
Observable
Javascript’s
Array
Java’s
Array
Java’s
Iterable
Memory
Composition
Kotlin’s
Iterable;
Java 8
Streams
Rx
Observable
Javascript’s
Array
declaratively
composable iterable
fun getPopulations(countries: Iterable<Country>)

= countries.map { it.population }
fun getPopulations(countries: Iterable<Country>)

= countries.map { it.population }
fun <T, R> Iterable<T>.map(transform: (T) -> R): List<R> {

val destination = ArrayList<R>(collectionSizeOrDefault(10))

for (item in this)

destination.add(transform(item))

return destination

}
fun <T, R> Iterable<T>.map(transform: (T) -> R): List<R> {

val destination = ArrayList<R>(collectionSizeOrDefault(10))

for (item in this)

destination.add(transform(item))

return destination

}
fun getTotalPopulationExcludingUs(countries: Iterable<Country>)

= countries

.filter { it.name == "United States" }

.map { it.population }

.reduce { total, currentPop -> total + currentPop }
fun getTotalPopulationExcludingUs(countries: Iterable<Country>)

= countries

.filter { it.name == "United States" }

.map { it.population }

.reduce { total, currentPop -> total + currentPop }
fun getTotalPopulationExcludingUs(countries: Iterable<Country>)

= countries

.filter { it.name == "United States" }

.map { it.population }

.reduce { total, currentPop -> total + currentPop }
fun getTotalPopulationExcludingUs(countries: Iterable<Country>)

= countries

.filter { it.name == "United States" }

.map { it.population }

.reduce { total, currentPop -> total + currentPop }
300e6 + 36e6 + 127e6 + …
declaratively
composable iterable
Java’s
Array
Java’s
Iterable
Memory
Composition
Kotlin’s
Iterable;
Java 8
Streams
Rx
Observable
Javascript’s
Array
Java’s
Array
Java’s
Iterable
Memory
Composition
Kotlin’s
Iterable;
Java 8
Streams
Rx
Observable
Javascript’s
Array
declaratively
composable sequence
declaratively
composable sequence
button.setOnClickListener(new View.OnClickListener() {

@Override public void onClick(View v) {

trackClick();

}

});
for (int buttonClick : buttonClicks) {

trackClick();

}
button.setOnClickListener(new View.OnClickListener() {

@Override public void onClick(View v) {

trackClick();

}

});
for (int buttonClick : buttonClicks) {

trackClick();

}
button.forEachClick(new View.OnClickListener() {

@Override public void onClick(View v) {

trackClick();

}

});
for (int buttonClick : buttonClicks) {

trackClick();

}
clickSequence.forEachClick(new View.OnClickListener() {

@Override public void onClick(View v) {

trackClick();

}

});
clickSequence.forEachClick(new View.OnClickListener() {

@Override public void onClick(View v) {

trackClick();

}

});
clickObservable.subscribe(new Consumer<View> {

@Override public void accept(View v) {

trackClick();

}

});
declaratively
composable sequence
declaratively
composable sequence
declaratively composable
iterable
map
filter
reduce
map
filter
reduce
+ LinkedList
map
filter
reduce
+ LinkedList = 💥
How is the sequence
stored in memory?
Iterable
How is the sequence
stored in memory?
map
filter
reduce
map
filter
reduce
+ Async
map
filter
reduce
+ Async = 💥
Is the sequence
currently in memory?
Observable
Is the sequence
currently in memory?
Array
Array LinkedList
Array LinkedList
Iterable
Array LinkedList
Iterable
…
Array LinkedList
Iterable
…
Array LinkedList
Iterable
…
Sequence
Array LinkedList
Iterable
…
Sequence
Array LinkedList
Iterable
…
Observable
declaratively
composable sequence
[k, ke, key, keyn, keyno, keynot, keynote]
[results for ‘k’, results for ‘ke', results for ‘key’…]
for each result, update UI
makeQueryTextObservable(mSearchView)

.flatMap { s -> makeLoadObservable(s) }

.subscribe { cursor ->

mResultsAdapter.swapCursor(cursor)

}
makeQueryTextObservable(mSearchView)

.flatMap { s -> makeLoadObservable(s) }

.subscribe { cursor ->

mResultsAdapter.swapCursor(cursor)

}
[k, ke, key, keyn, keyno, keynot, keynote]
makeQueryTextObservable(mSearchView)

.flatMap { s -> makeLoadObservable(s) }

.subscribe { cursor ->

mResultsAdapter.swapCursor(cursor)

}
makeQueryTextObservable(mSearchView)

.flatMap { s -> makeLoadObservable(s) }

.subscribe { cursor ->

mResultsAdapter.swapCursor(cursor)

}
makeQueryTextObservable(mSearchView)

.flatMap { s -> makeLoadObservable(s) }

.subscribe { cursor ->

mResultsAdapter.swapCursor(cursor)

}
makeQueryTextObservable(mSearchView)

.flatMap { s -> makeLoadObservable(s) }

.subscribe { cursor ->

mResultsAdapter.swapCursor(cursor)

}
[results for ‘k’, results for ‘ke', results for ‘key’…]
makeQueryTextObservable(mSearchView)

.flatMap { s -> makeLoadObservable(s) }

.subscribe { cursor ->

mResultsAdapter.swapCursor(cursor)

}
makeQueryTextObservable(mSearchView)

.flatMap { s -> makeLoadObservable(s) }

.subscribe { cursor ->

mResultsAdapter.swapCursor(cursor)

}
makeQueryTextObservable(mSearchView)

.flatMap { s -> makeLoadObservable(s) }

.subscribe { cursor ->

mResultsAdapter.swapCursor(cursor)

}
makeQueryTextObservable(mSearchView)
.filter { s -> s.length > 3 }

.flatMap { s -> makeLoadObservable(s) }

.subscribe { cursor ->

mResultsAdapter.swapCursor(cursor)

}
makeQueryTextObservable(mSearchView)
.filter { s -> s.length > 3 }

.flatMap { s -> makeLoadObservable(s) }

.subscribe { cursor ->

mResultsAdapter.swapCursor(cursor)

}
[k, ke, key, keyn, keyno, keynot, keynote]
filter
[keyn, keyno, keynot, keynote]
makeQueryTextObservable(mSearchView)
.filter { s -> s.length > 3 }

.flatMap { s -> makeLoadObservable(s) }

.subscribe { cursor ->

mResultsAdapter.swapCursor(cursor)

}
makeQueryTextObservable(mSearchView!!)

.filter { s -> s.length > 3 }

.debounce(300, TimeUnit.MILLISECONDS)

.flatMap { s -> makeLoadObservable(s) }

.subscribe { cursor ->

mResultsAdapter!!.swapCursor(cursor)

}
makeQueryTextObservable(mSearchView!!)

.filter { s -> s.length > 3 }

.debounce(300, TimeUnit.MILLISECONDS)

.flatMap { s -> makeLoadObservable(s) }

.subscribe { cursor ->

mResultsAdapter!!.swapCursor(cursor)

}
makeQueryTextObservable(mSearchView!!)

.filter { s -> s.length > 3 }

.debounce(300, TimeUnit.MILLISECONDS)

.flatMap { s -> makeLoadObservable(s) }

.subscribe { cursor ->

mResultsAdapter!!.swapCursor(cursor)

}
makeQueryTextObservable(mSearchView!!)

.filter { s -> s.length > 3 }

.debounce(300, TimeUnit.MILLISECONDS)

.flatMap { s -> makeLoadObservable(s) }

.subscribeOn(Schedulers.io())

.observeOn(AndroidSchedulers.mainThread())

.subscribe { cursor ->

mResultsAdapter!!.swapCursor(cursor)

}
makeQueryTextObservable(mSearchView!!)

.filter { s -> s.length > 3 }

.debounce(300, TimeUnit.MILLISECONDS)

.flatMap { s -> makeLoadObservable(s) }

.subscribeOn(Schedulers.io())

.observeOn(AndroidSchedulers.mainThread())

.subscribe { cursor ->

mResultsAdapter!!.swapCursor(cursor)

}
makeQueryTextObservable(mSearchView!!)

.filter { s -> s.length > 3 }

.debounce(300, TimeUnit.MILLISECONDS)

.flatMap { s -> makeLoadObservable(s) }

.subscribeOn(Schedulers.io())

.observeOn(AndroidSchedulers.mainThread())

.subscribe { cursor ->

mResultsAdapter!!.swapCursor(cursor)

}
declaratively
composable sequence
An Introduction to
RxJava
https://twitter.com/philosohacker
https://twitter.com/unikeytech

Contenu connexe

Tendances

Time Series Analysis by JavaScript LL matsuri 2013
Time Series Analysis by JavaScript LL matsuri 2013 Time Series Analysis by JavaScript LL matsuri 2013
Time Series Analysis by JavaScript LL matsuri 2013
Daichi Morifuji
 
Open XKE - Big Data, Big Mess par Bertrand Dechoux
Open XKE - Big Data, Big Mess par Bertrand DechouxOpen XKE - Big Data, Big Mess par Bertrand Dechoux
Open XKE - Big Data, Big Mess par Bertrand Dechoux
Publicis Sapient Engineering
 
Laboratory activity 3 b3
Laboratory activity 3 b3Laboratory activity 3 b3
Laboratory activity 3 b3
Jomel Penalba
 
computer notes - Data Structures - 21
computer notes - Data Structures - 21computer notes - Data Structures - 21
computer notes - Data Structures - 21
ecomputernotes
 

Tendances (19)

Time Series Analysis by JavaScript LL matsuri 2013
Time Series Analysis by JavaScript LL matsuri 2013 Time Series Analysis by JavaScript LL matsuri 2013
Time Series Analysis by JavaScript LL matsuri 2013
 
Modern Algorithms and Data Structures - 1. Bloom Filters, Merkle Trees
Modern Algorithms and Data Structures - 1. Bloom Filters, Merkle TreesModern Algorithms and Data Structures - 1. Bloom Filters, Merkle Trees
Modern Algorithms and Data Structures - 1. Bloom Filters, Merkle Trees
 
The Ring programming language version 1.5.4 book - Part 68 of 185
The Ring programming language version 1.5.4 book - Part 68 of 185The Ring programming language version 1.5.4 book - Part 68 of 185
The Ring programming language version 1.5.4 book - Part 68 of 185
 
Palestra collection google
Palestra collection googlePalestra collection google
Palestra collection google
 
Rのスコープとフレームと環境と
Rのスコープとフレームと環境とRのスコープとフレームと環境と
Rのスコープとフレームと環境と
 
Open XKE - Big Data, Big Mess par Bertrand Dechoux
Open XKE - Big Data, Big Mess par Bertrand DechouxOpen XKE - Big Data, Big Mess par Bertrand Dechoux
Open XKE - Big Data, Big Mess par Bertrand Dechoux
 
Laboratory activity 3 b3
Laboratory activity 3 b3Laboratory activity 3 b3
Laboratory activity 3 b3
 
Rデバッグあれこれ
RデバッグあれこれRデバッグあれこれ
Rデバッグあれこれ
 
The Ring programming language version 1.10 book - Part 80 of 212
The Ring programming language version 1.10 book - Part 80 of 212The Ring programming language version 1.10 book - Part 80 of 212
The Ring programming language version 1.10 book - Part 80 of 212
 
Ejemplo radio
Ejemplo radioEjemplo radio
Ejemplo radio
 
Tricks
TricksTricks
Tricks
 
Scala dsls-dissecting-and-implementing-rogue
Scala dsls-dissecting-and-implementing-rogueScala dsls-dissecting-and-implementing-rogue
Scala dsls-dissecting-and-implementing-rogue
 
MySQL 5.7 NF – JSON Datatype 활용
MySQL 5.7 NF – JSON Datatype 활용MySQL 5.7 NF – JSON Datatype 활용
MySQL 5.7 NF – JSON Datatype 활용
 
AJUG April 2011 Raw hadoop example
AJUG April 2011 Raw hadoop exampleAJUG April 2011 Raw hadoop example
AJUG April 2011 Raw hadoop example
 
多治見IT勉強会 Groovy Grails
多治見IT勉強会 Groovy Grails多治見IT勉強会 Groovy Grails
多治見IT勉強会 Groovy Grails
 
Techtalk Rolling Scopes 2017 neural networks
Techtalk Rolling Scopes 2017 neural networksTechtalk Rolling Scopes 2017 neural networks
Techtalk Rolling Scopes 2017 neural networks
 
The Ring programming language version 1.5.2 book - Part 76 of 181
The Ring programming language version 1.5.2 book - Part 76 of 181The Ring programming language version 1.5.2 book - Part 76 of 181
The Ring programming language version 1.5.2 book - Part 76 of 181
 
mobl
moblmobl
mobl
 
computer notes - Data Structures - 21
computer notes - Data Structures - 21computer notes - Data Structures - 21
computer notes - Data Structures - 21
 

Similaire à An Introduction to RxJava

Solve the coding errors for upvotemake test-statsg++ -g -std=c++.pdf
Solve the coding errors for upvotemake test-statsg++ -g -std=c++.pdfSolve the coding errors for upvotemake test-statsg++ -g -std=c++.pdf
Solve the coding errors for upvotemake test-statsg++ -g -std=c++.pdf
snewfashion
 
Pragmatic Real-World Scala
Pragmatic Real-World ScalaPragmatic Real-World Scala
Pragmatic Real-World Scala
parag978978
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
Hiroshi Ono
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
Hiroshi Ono
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
Hiroshi Ono
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
Hiroshi Ono
 
Multi dimensional arrays
Multi dimensional arraysMulti dimensional arrays
Multi dimensional arrays
Aseelhalees
 
An introduction to property-based testing
An introduction to property-based testingAn introduction to property-based testing
An introduction to property-based testing
Vincent Pradeilles
 

Similaire à An Introduction to RxJava (20)

An Introduction to Property Based Testing
An Introduction to Property Based TestingAn Introduction to Property Based Testing
An Introduction to Property Based Testing
 
Futures e abstração - QCon São Paulo 2015
Futures e abstração - QCon São Paulo 2015Futures e abstração - QCon São Paulo 2015
Futures e abstração - QCon São Paulo 2015
 
Java 8 Examples
Java 8 ExamplesJava 8 Examples
Java 8 Examples
 
Solve the coding errors for upvotemake test-statsg++ -g -std=c++.pdf
Solve the coding errors for upvotemake test-statsg++ -g -std=c++.pdfSolve the coding errors for upvotemake test-statsg++ -g -std=c++.pdf
Solve the coding errors for upvotemake test-statsg++ -g -std=c++.pdf
 
Basic java, java collection Framework and Date Time API
Basic java, java collection Framework and Date Time APIBasic java, java collection Framework and Date Time API
Basic java, java collection Framework and Date Time API
 
JAVA 8 : Migration et enjeux stratégiques en entreprise
JAVA 8 : Migration et enjeux stratégiques en entrepriseJAVA 8 : Migration et enjeux stratégiques en entreprise
JAVA 8 : Migration et enjeux stratégiques en entreprise
 
Developer Testing Tools Roundup
Developer Testing Tools RoundupDeveloper Testing Tools Roundup
Developer Testing Tools Roundup
 
Collection Core Concept
Collection Core ConceptCollection Core Concept
Collection Core Concept
 
Pragmatic Real-World Scala (short version)
Pragmatic Real-World Scala (short version)Pragmatic Real-World Scala (short version)
Pragmatic Real-World Scala (short version)
 
Pragmatic Real-World Scala
Pragmatic Real-World ScalaPragmatic Real-World Scala
Pragmatic Real-World Scala
 
collections
collectionscollections
collections
 
Mary Had a Little λ (QCon)
Mary Had a Little λ (QCon)Mary Had a Little λ (QCon)
Mary Had a Little λ (QCon)
 
Collections Framework
Collections FrameworkCollections Framework
Collections Framework
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
 
Multi dimensional arrays
Multi dimensional arraysMulti dimensional arrays
Multi dimensional arrays
 
An introduction to property-based testing
An introduction to property-based testingAn introduction to property-based testing
An introduction to property-based testing
 
What's new in C# 6 - NetPonto Porto 20160116
What's new in C# 6  - NetPonto Porto 20160116What's new in C# 6  - NetPonto Porto 20160116
What's new in C# 6 - NetPonto Porto 20160116
 

Plus de K. Matthew Dupree

Plus de K. Matthew Dupree (8)

intro-to-metaprogramming-in-r.pdf
intro-to-metaprogramming-in-r.pdfintro-to-metaprogramming-in-r.pdf
intro-to-metaprogramming-in-r.pdf
 
Intro To Gradient Descent in Javascript
Intro To Gradient Descent in JavascriptIntro To Gradient Descent in Javascript
Intro To Gradient Descent in Javascript
 
Dagger 2, 2 years later
Dagger 2, 2 years laterDagger 2, 2 years later
Dagger 2, 2 years later
 
If Android Tests Could Talk
If Android Tests Could TalkIf Android Tests Could Talk
If Android Tests Could Talk
 
Writing testable android apps
Writing testable android appsWriting testable android apps
Writing testable android apps
 
Di and Dagger
Di and DaggerDi and Dagger
Di and Dagger
 
Functional Testing for React Native Apps
Functional Testing for React Native AppsFunctional Testing for React Native Apps
Functional Testing for React Native Apps
 
Testable android apps
Testable android appsTestable android apps
Testable android apps
 

Dernier

Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 

Dernier (20)

EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024
 
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 

An Introduction to RxJava