March 16, 2016 | GitHub: ksza / rx_tmjug
March 16, 2016 | GitHub: ksza / rx_tmjug
March 16, 2016 | GitHub: ksza / rx_tmjug
ReactiveX is more than an API, it's an idea and a breakthrough in programming. It has inspired several other APIs, frameworks, and even programming languages.
March 16, 2016 | GitHub: ksza / rx_tmjug
The hardest part of the learning journey is thinking in Reactive
... we'll try a kata
March 16, 2016 | GitHub: ksza / rx_tmjug
March 16, 2016 | GitHub: ksza / rx_tmjug
... a Reactive Extension for the JVM
March 16, 2016 | GitHub: ksza / rx_tmjug
ReactiveX is a combination of the best ideas from
the Observer pattern, the Iterator pattern, and functional programming
March 16, 2016 | GitHub: ksza / rx_tmjug
obs = Observable.just(1, 2, 3, 4, 5);
obs.subscribe(onNext, onError, onComplete);
1
2
3
4
5
March 16, 2016 | GitHub: ksza / rx_tmjug
obs.subscribe(new Action1<Integer>() {
@Override
public void call(Integer value) { /* on emition */ }
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) { /* on error */ }
}, new Action0() {
@Override
public void call() { /* on complete */ }
});
March 16, 2016 | GitHub: ksza / rx_tmjug
Observable.just(1, 2, 3, 4, 5)
.map(new Func1<Integer, String>() {
@Override
public String call(Integer number) {
return number.toString();
}
});
March 16, 2016 | GitHub: ksza / rx_tmjug
March 16, 2016 | GitHub: ksza / rx_tmjug
(Chaining)
Observable obs = Observable.just(1, 2, 3, 4, 5)
.filter(new Func1<Integer, Boolean>() {
@Override
public Boolean call(Integer number) {
return number % 2 == 0;
}
})
.map(new Func1<Integer, String>() {
@Override
public String call(Integer number) {
return number.toString();
}
});
March 16, 2016 | GitHub: ksza / rx_tmjug
March 16, 2016 | GitHub: ksza / rx_tmjug
March 16, 2016 | GitHub: ksza / rx_tmjug
public void fetchUserDetails() {
// first, request the users...
mService.requestUsers(new Callback<GithubUsersResponse>() {
@Override
public void success(final GithubUsersResponse githubUsersResponse, final Response response) {
// Request Users request completed
final List<GithubUserDetail> githubUserDetails = new ArrayList<GithubUserDetail>();
// next, loop over each item in the response
for (GithubUserDetail githubUserDetail : githubUsersResponse) {
// request a detail object for that user
mService.requestUserDetails(githubUserDetail.mLogin, new Callback<GithubUserDetail>() {
@Override
public void success(GithubUserDetail githubUserDetail, Response response) {
// User Detail request completed for user
githubUserDetails.add(githubUserDetail);
if (githubUserDetails.size() == githubUsersResponse.mGithubUsers.size()) {
// update UI with user details
}
}
@Override
public void failure(RetrofitError error) {
// Request User Detail Failed
}
});
}
}
@Override
public void failure(RetrofitError error) { /* Request User Failed!!!! */ }
});
}
public void rxFetchUserDetails() {
// request the users
mService.rxRequestUsers().concatMap(Observable::from)
.concatMap((GithubUser githubUser) ->
// request the details for each user
mService.rxRequestUserDetails(githubUser.mLogin)
)
// accumulate them as a list
.toList()
// define which threads information will be passed on
.subscribeOn(Schedulers.newThread())
.observeOn(JavaFxScheduler.getInstance())
// post them on an eventbus
.subscribe(githubUserDetails -> { /* update UI with user details */ });
}
git clone git@github.com:ksza/rx_tmjug.git
cd rx_tmjug
git checkout ex1
git checkout -b ex1
March 16, 2016 | GitHub: ksza / rx_tmjug
"... they provide a clear and concise way to represent one method interface using an expression ... "
-- Java 8
March 16, 2016 | GitHub: ksza / rx_tmjug
/* no arguments, single statement */ () -> 42
/* one argument */ number -> number * 2
/* multiple arguments */ (i, j) -> i * j
/* multiple arguments types */ (int i, long j) -> i * j
/* multiple statements */
(int i, long j) -> { long result = i * j; return result; }
March 16, 2016 | GitHub: ksza / rx_tmjug
Observable.just(1, 2, 3, 4, 5)
.map(new Func1<Integer, String>() {
@Override
public String call(Integer number) {
return number.toString();
}
});
becomes
Observable.just(1, 2, 3, 4, 5)
.map(i -> i.toString());
March 16, 2016 | GitHub: ksza / rx_tmjug
obs = Observable.just("1", "2", "3")
/* lambda enhanced code */
obs.map(nr -> Integer.parseInt(nr))
/* using method reference */
obs.map(Integer::parseInt)
March 16, 2016 | GitHub: ksza / rx_tmjug
Neat huh?! Let's get to work
March 16, 2016 | GitHub: ksza / rx_tmjug
March 16, 2016 | GitHub: ksza / rx_tmjug
"Retrofit turns your HTTP API into a Java interface"
March 16, 2016 | GitHub: ksza / rx_tmjug
public interface OmdbApi {
@GET("/?y=&plot=short&r=json")
Observable<OmdbMovie> findByTitle(@Query("t") String t);
}
...
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://www.omdbapi.com")
.build();
OmdbApi api = retrofit.create(OmdbApi.class);
March 16, 2016 | GitHub: ksza / rx_tmjug
git add -A && git commit -m "progress"
git checkout ex2
git checkout -b ex2
March 16, 2016 | GitHub: ksza / rx_tmjug
March 16, 2016 | GitHub: ksza / rx_tmjug
March 16, 2016 | GitHub: ksza / rx_tmjug
March 16, 2016 | GitHub: ksza / rx_tmjug
git add -A && git commit -m "progress"
git checkout ex3
git checkout -b ex3
March 16, 2016 | GitHub: ksza / rx_tmjug
March 16, 2016 | GitHub: ksza / rx_tmjug
Returns an Observable that emits items based on applying a function that you supply to each item emitted by the source Observable, where that function returns an Observable, and then merging those resulting Observables and emitting the results of this merger.
March 16, 2016 | GitHub: ksza / rx_tmjug
RxTextView.textChanges(searchText)
.flatMap(title -> omdbApi.searchByTitle(title))
.subscribeOn(Schedulers.io());
RxTextView.textChanges(searchText)
.flatMap(
title -> omdbApi.searchByTitle(title)
.subscribeOn(Schedulers.io())
);
March 16, 2016 | GitHub: ksza / rx_tmjug
March 16, 2016 | GitHub: ksza / rx_tmjug
git add -A && git commit -m "progress"
git checkout ex4
git checkout -b ex4
March 16, 2016 | GitHub: ksza / rx_tmjug
To improve:
March 16, 2016 | GitHub: ksza / rx_tmjug
March 16, 2016 | GitHub: ksza / rx_tmjug
March 16, 2016 | GitHub: ksza / rx_tmjug
March 16, 2016 | GitHub: ksza / rx_tmjug
March 16, 2016 | GitHub: ksza / rx_tmjug
March 16, 2016 | GitHub: ksza / rx_tmjug
March 16, 2016 | GitHub: ksza / rx_tmjug
March 16, 2016 | GitHub: ksza / rx_tmjug
March 16, 2016 | GitHub: ksza / rx_tmjug
March 16, 2016 | GitHub: ksza / rx_tmjug
When the Producer is faster than the consumer
March 16, 2016 | GitHub: ksza / rx_tmjug
March 16, 2016 | GitHub: ksza / rx_tmjug
March 16, 2016 | GitHub: ksza / rx_tmjug
February 19, 2016 | GitHub: 3pillarlabs / rx_android_workshop
ToDo:
March 16, 2016 | GitHub: ksza / rx_tmjug