SlideShare a Scribd company logo
1 of 171
Download to read offline


















public interface Callback {
void onSuccess(List<Recipe> recipes);
void onError(Throwable t);
}
public void searchRecipe(String keyword, Callback callback) {

recipeApiClient.search(keyword, callback);

}
searchRecipe(“ステーキ”, new Callback() {
@Override
public void onSuccess(List<Recipe> recipes) {

addToList(recipes);
}
@Override
public void onError(Throwable t) {
showErrorView(t);
}
});

}
searchRecipe(“ステーキ”, new Callback() {
@Override
public void onSuccess(List<Recipe> recipes) {

addToList(recipes);
}
@Override
public void onError(Throwable t) {
showErrorView(t);
}
});

}
searchRecipe(“ステーキ”, new Callback() {
@Override
public void onSuccess(List<Recipe> recipes) {

addToList(recipes);
}
@Override
public void onError(Throwable t) {
showErrorView(t);
}
});

}
searchRecipe(“ステーキ”, new Callback() {
@Override
public void onSuccess(List<Recipe> recipes) {

addToList(recipes);
}
@Override
public void onError(Throwable t) {
showErrorView(t);
}
});

}
searchRecipe(“ステーキ”, new Callback() {
@Override
public void onSuccess(List<Recipe> recipes) {

addToList(recipes);
}
@Override
public void onError(Throwable t) {
showErrorView(t);
}
});

}
!
searchRecipe(“ステーキ”, new Callback() {
@Override
public void onSuccess(List<Recipe> recipes) {

addToList(recipes);
}
@Override
public void onError(Throwable t) {
showErrorView(t);
}
});

}
!
!
searchRecipe(“ステーキ”, new Callback() {
@Override
public void onSuccess(List<Recipe> recipes) {

addToList(recipes);
}
@Override
public void onError(Throwable t) {
showErrorView(t);
}
});

}
!
!
!
searchRecipe(“ステーキ”, new Callback() {
@Override
public void onSuccess(List<Recipe> recipes) {

addToList(recipes);
}
@Override
public void onError(Throwable t) {
showErrorView(t);
}
});

}
!
!
!
!
searchRecipe(“ステーキ”, new Callback() {
@Override
public void onSuccess(List<Recipe> recipes) {

addToList(recipes);
}
@Override
public void onError(Throwable t) {
showErrorView(t);
}
});

}
searchRecipe(“ステーキ”, new Callback() {
@Override
public void onSuccess(List<Recipe> recipes) {

addToList(recipes);
}
@Override
public void onError(Throwable t) {
showErrorView(t);
}
});

}
searchRecipe(“ステーキ”, new Callback() {
@Override
public void onSuccess(List<Recipe> recipes) {

addToList(recipes);
}
@Override
public void onError(Throwable t) {
showErrorView(t);
}
});

}
searchRecipe(“ステーキ”, new Callback() {
@Override
public void onSuccess(List<Recipe> recipes) {

addToList(recipes);
}
@Override
public void onError(Throwable t) {
showErrorView(t);
}
});

}
searchRecipe(“ステーキ”, new Callback() {
@Override
public void onSuccess(List<Recipe> recipes) {

addToList(recipes);
}
@Override
public void onError(Throwable t) {
showErrorView(t);
}
});

}
"


# app/build.gradle

dependencies {

compile 'io.reactivex:rxjava:1.1.1'
compile 'io.reactivex:rxandroid:1.1.0'

}
public void searchRecipe(String keyword, Callback callback) {

recipeApiClient.search(keyword, callback);

}
public void searchRecipe(String keyword, Callback callback) {

recipeApiClient.search(keyword, callback);

}
public void searchRecipe(String keyword, Callback callback) {

recipeApiClient.search(keyword, callback);

}


public void searchRecipe(String keyword) {

recipeApiClient.search(keyword, new Callback() {
@Override
public void onSuccess(List<Recipe> recipes) {
}
@Override
public void onError(Throwable t) {
}
});

}


public void searchRecipe(String keyword) {

recipeApiClient.search(keyword, new Callback() {
@Override
public void onSuccess(List<Recipe> recipes) {
}
@Override
public void onError(Throwable t) {
}
});

}


public Observable<List<Recipe>> searchRecipe(String keyword) {

recipeApiClient.search(keyword, new Callback() {
@Override
public void onSuccess(List<Recipe> recipes) {

}
@Override
public void onError(Throwable t) {

}
});

}


public Observable<List<Recipe>> searchRecipe(String keyword) {

recipeApiClient.search(keyword, new Callback() {
@Override
public void onSuccess(List<Recipe> recipes) {

}
@Override
public void onError(Throwable t) {

}
});

}
public Observable<List<Recipe>> searchRecipe(String keyword) {
return Observable.create(subscriber -> {























});
}
void


recipeApiClient.search(keyword, new Callback() {

@Override

public void onSuccess(List<Recipe> recipes) {





}
@Override
public void onError(Throwable t) {

}

});
public Observable<List<Recipe>> searchRecipe(String keyword) {
return Observable.create(subscriber -> {

recipeApiClient.search(keyword, new Callback() {

@Override

public void onSuccess(List<Recipe> recipes) {





}
@Override
public void onError(Throwable t) {


}
});
});
}
void
public Observable<List<Recipe>> searchRecipe(String keyword) {
return Observable.create(subscriber -> {

recipeApiClient.search(keyword, new Callback() {

@Override

public void onSuccess(List<Recipe> recipes) {

subscriber.onNext(recipes);// イベントの通知
subscriber.onCompleted(); // 全イベントが終了した通知

}
@Override
public void onError(Throwable t) {
subscriber.onError(t); // 処理内で失敗した通知
}
});
});
}
void
public Observable<List<Recipe>> searchRecipe(String keyword) {
return Observable.create(subscriber -> {

recipeApiClient.search(keyword, new Callback() {

@Override

public void onSuccess(List<Recipe> recipes) {

subscriber.onNext(recipes);// イベントの通知
subscriber.onCompleted(); // 全イベントが終了した通知

}
@Override
public void onError(Throwable t) {
subscriber.onError(t); // 処理内で失敗した通知
}
});
});
}
void
public Observable<List<Recipe>> searchRecipe(String keyword) {
return Observable.create(subscriber -> {

recipeApiClient.search(keyword, new Callback() {

@Override

public void onSuccess(List<Recipe> recipes) {

subscriber.onNext(recipes);// イベントの通知
subscriber.onCompleted(); // 全イベントが終了した通知

}
@Override
public void onError(Throwable t) {
subscriber.onError(t); // 処理内で失敗した通知
}
});
});
}
void
public List<Recipe> searchRecipe(String keyword) throws HttpException {
// okhttpとかHttpClientで同期通信

}


public Observable<List<Recipe>> searchRecipe(String keyword) {
return Observable.create(subscriber -> {
try{

List<Recipe> recipes = ApiClient.search(keyword);
subscriber.onNext(recipes);
subscriber.onFinished();
} catch(HttpException e) {

subscriber.onError(e);

}
}
searchRecipe(“ステーキ”)
.subscribe(new Subscriber<List<Recipe>>() {

@Override

public void onNext(List<Recipe> recipe) {

addToList(recipes);

}

@Override

public void onError(Throwable e) {

showErrorMessage(t);

}



@Override

public void onCompleted() { 

});
);
searchRecipe(“ステーキ”)
.subscribe(new Subscriber<List<Recipe>>() {

@Override

public void onNext(List<Recipe> recipe) {

addToList(recipes);

}

@Override

public void onError(Throwable e) {

showErrorMessage(t);

}



@Override

public void onCompleted() { 

});
);
searchRecipe(“ステーキ”)
.subscribe(new Subscriber<List<Recipe>>() {

@Override

public void onNext(List<Recipe> recipe) {

addToList(recipes);

}

@Override

public void onError(Throwable e) {

showErrorMessage(t);

}



@Override

public void onCompleted() { 

});
);
searchRecipe(“ステーキ”)
.subscribe(new Subscriber<List<Recipe>>() {

@Override

public void onNext(List<Recipe> recipe) {

addToList(recipes);

}

@Override

public void onError(Throwable e) {

showErrorMessage(t);

}



@Override

public void onCompleted() { 

});
);
searchRecipe(“ステーキ”)
.subscribe(new Subscriber<List<Recipe>>() {

@Override

public void onNext(List<Recipe> recipe) {

addToList(recipes);

}

@Override

public void onError(Throwable e) {

showErrorMessage(t);

}



@Override

public void onCompleted() { 

});
);
!
searchRecipe(“ステーキ”)
.subscribe(new Subscriber<List<Recipe>>() {

@Override

public void onNext(List<Recipe> recipe) {

addToList(recipes);

}

@Override

public void onError(Throwable e) {

showErrorMessage(t);

}



@Override

public void onCompleted() { 

});
);
!
!
searchRecipe(“ステーキ”)
.subscribe(new Subscriber<List<Recipe>>() {

@Override

public void onNext(List<Recipe> recipe) {

addToList(recipes);

}

@Override

public void onError(Throwable e) {

showErrorMessage(t);

}



@Override

public void onCompleted() { 

});
);
!
!
!
searchRecipe(“ステーキ”)
.subscribe(new Subscriber<List<Recipe>>() {

@Override

public void onNext(List<Recipe> recipe) {

addToList(recipes);

}

@Override

public void onError(Throwable e) {

showErrorMessage(t);

}



@Override

public void onCompleted() { 

});
);
!
!
!
!
searchRecipe(“ステーキ”)
.subscribe(recipes -> {
addToList(recipes);
},
throwable -> {
showErrorMessage(t);
},
() -> {

// 省略可能

}
);
searchRecipe(“ステーキ”)
.subscribe(recipes -> {
addToList(recipes);
},
throwable -> {
showErrorMessage(t);
},
() -> {

// 省略可能

}
);
searchRecipe(“ステーキ”)
.subscribe(recipes -> {
addToList(recipes);
},
throwable -> {
showErrorMessage(t);
},
() -> {

// 省略可能

}
);
searchRecipe(“ステーキ”)
.subscribe(recipes -> {
addToList(recipes);
},
throwable -> {
showErrorMessage(t);
},
() -> {

// 省略可能

}
);
!
!
!
!
🙇
searchRecipeBy(“ステーキ”)

.map(recipes -> { /* todo something */ })

.subscribeOn(Schedulers.io())

.map(recipes -> { /* todo something */ })
.subscribe(recipes -> {});
searchRecipeBy(“ステーキ”)

.map(recipes -> { /* todo something */ })

.subscribeOn(Schedulers.io())

.map(recipes -> { /* todo something */ })
.subscribe(recipes -> {});


searchRecipeBy(“ステーキ”)

.map(recipes -> { /* todo something */ })

.subscribeOn(Schedulers.io())

.observeOn(AndroidSchedulers.mainThread())

.map(recipes -> { /* todo something */ })
.observeOn(Schedulers.io())
.subscribe(recipes -> {});
searchRecipeBy(“ステーキ”)

.map(recipes -> { /* todo something */ })

.subscribeOn(Schedulers.io())

.observeOn(AndroidSchedulers.mainThread())

.map(recipes -> { /* todo something */ })
.observeOn(Schedulers.io())
.subscribe(recipes -> {});
searchRecipeBy(“ステーキ”)

.map(recipes -> { /* todo something */ })

.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(recipes -> {});


searchRecipe(“ステーキ”)

.subscribeOn(schedulers.io())

.observeOn(AndroidSchedulers.mainThread())
.subscribe(recipes -> {
addToList(recipes);
},
throwable -> {
showErrorMessage(t);
}
);
searchRecipe(“ステーキ”)

.subscribeOn(schedulers.io())

.observeOn(AndroidSchedulers.mainThread())
.subscribe(recipes -> {
addToList(recipes);
},
throwable -> {
showErrorMessage(t);
}
);
searchRecipe(“ステーキ”)

.subscribeOn(schedulers.io())

.observeOn(AndroidSchedulers.mainThread())
.subscribe(recipes -> {
addToList(recipes);
},
throwable -> {
showErrorMessage(t);
}
);
searchRecipe(“ステーキ”)

.subscribeOn(schedulers.io())

.observeOn(AndroidSchedulers.mainThread())
.subscribe(recipes -> {
addToList(recipes);
},
throwable -> {
showErrorMessage(t);
}
);
!
!
!
!


searchRecipeBy(“ハンバーグ”, new Callback() {
@Override
public void onSuccess(List<Recipe> recipes) {

if(getActivity() == null) { return; }

addToList(recipes);
}
@Override
public void onError(Throwable t) {

if(getActivity() == null) { return; }
showErrorMessage(t);
}
});

}


# app/build.gradle

dependencies {

compile 'com.trello:rxlifecycle:0.4.0'
compile 'com.trello:rxlifecycle-components:0.4.0'

}
searchRecipeBy(“ハンバーグ”)
.compose(bindToLifecycle())

.subscribeOn(schedulers.io())

.observeOn(AndroidSchedulers.mainThread())
.subscribe(recipes -> {
addList(recipes);
},
throwable -> {
showErrorMessage(t);
}
);
searchRecipeBy(“ハンバーグ”)
.compose(bindToLifecycle())

.subscribeOn(schedulers.io())

.observeOn(AndroidSchedulers.mainThread())
.subscribe(recipes -> {
addList(recipes);
},
throwable -> {
showErrorMessage(t);
}
);
searchRecipeBy(“ハンバーグ”)
.compose(bindToLifecycle())

.subscribeOn(schedulers.io())

.observeOn(AndroidSchedulers.mainThread())
.subscribe(recipes -> {
addList(recipes);
},
throwable -> {
showErrorMessage(t);
}
);
searchRecipeBy(“ハンバーグ”)
.compose(bindToLifecycle())

.subscribeOn(schedulers.io())

.observeOn(AndroidSchedulers.mainThread())
.subscribe(recipes -> {
addList(recipes);
},
throwable -> {
showErrorMessage(t);
}
);
!
!
!
!
searchRecipeBy(“ハンバーグ”)
.compose(bindToLifecycle())

.subscribeOn(schedulers.io())

.observeOn(AndroidSchedulers.mainThread())
.subscribe(recipes -> {
addList(recipes);
},
throwable -> {
showErrorMessage(t);
}
);
searchRecipeBy(“ハンバーグ”)
.compose(bindToLifecycle())

.subscribeOn(schedulers.io())

.observeOn(AndroidSchedulers.mainThread())
.subscribe(recipes -> {
addList(recipes);
},
throwable -> {
showErrorMessage(t);
}
);
searchRecipeBy(“ハンバーグ”)
.compose(bindToLifecycle())

.subscribeOn(schedulers.io())

.observeOn(AndroidSchedulers.mainThread())
.subscribe(recipes -> {
addList(recipes);
},
throwable -> {
showErrorMessage(t);
}
);


searchRecipeBy(“ハンバーグ”)
.compose(bindToLifecycle())

.subscribeOn(schedulers.io())

.observeOn(AndroidSchedulers.mainThread())
.subscribe(recipes -> {
addList(recipes);
},
throwable -> {
showErrorMessage(t);
}
);






#
#
#
#
!
!
!
#
#
#
#
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
Observable.combineLatest(

Observable.just(1),

Observable.just(2),

(i1,i2) -> i1 + i2 // この場合、3が次のオペレーターに渡る

);
Observable.combineLatest(

Observable.just(1),

Observable.just(2),

(i1,i2) -> Pair.create(i1, i2)

);
Observable.combineLatest(

Observable.just(1),

Observable.just(2),

Pair::create

);
Observable.combineLatest(
searchRecipe(“ステーキ”),
searchAd(“ステーキ”), // 広告情報を取得するメソッドだと思って下さい
Pair::create
)

.subscribeOn(schedulers.io())

.observeOn(AndroidSchedulers.mainThread())
.subscribe(pair -> {
addToListWithBannerIfExist(pair.first, pair.second);
},
throwable -> {
showErrorMessage(t);
}
);
Observable.combineLatest(
searchRecipe(“ステーキ”),
searchAd(“ステーキ”), // 広告情報を取得するメソッドだと思って下さい
Pair::create
)

.subscribeOn(schedulers.io())

.observeOn(AndroidSchedulers.mainThread())
.subscribe(pair -> {
addToListWithBannerIfExist(pair.first, pair.second);
},
throwable -> {
showErrorMessage(t);
}
);
Observable.combineLatest(
searchRecipe(“ステーキ”),
searchAd(“ステーキ”), // 広告情報を取得するメソッドだと思って下さい
Pair::create
)

.subscribeOn(schedulers.io())

.observeOn(AndroidSchedulers.mainThread())
.subscribe(pair -> {
addToListWithBannerIfExist(pair.first, pair.second);
},
throwable -> {
showErrorMessage(t);
}
);
Observable.combineLatest(
searchRecipe(“ステーキ”),
searchAd(“ステーキ”), // 広告情報を取得するメソッドだと思って下さい
Pair::create
)

.subscribeOn(schedulers.io())

.observeOn(AndroidSchedulers.mainThread())
.subscribe(pair -> {
addToListWithBannerIfExist(pair.first, pair.second);
},
throwable -> {
showErrorMessage(t);
}
);
Observable.combineLatest(
searchRecipe(“ステーキ”),
searchAd(“ステーキ”), // 広告情報を取得するメソッドだと思って下さい
Pair::create
)

.subscribeOn(schedulers.io())

.observeOn(AndroidSchedulers.mainThread())
.subscribe(pair -> {
addToListWithBannerIfExist(pair.first, pair.second);
},
throwable -> {
showErrorMessage(t);
}
);
Observable.combineLatest(
searchRecipe(“ステーキ”),
searchAd(“ステーキ”), // 広告情報を取得するメソッドだと思って下さい
Pair::create
)

.subscribeOn(schedulers.io())

.observeOn(AndroidSchedulers.mainThread())
.subscribe(pair -> {
addToListWithBannerIfExist(pair.first, pair.second);
},
throwable -> {
showErrorMessage(t);
}
);
Observable.combineLatest(
searchRecipe(“ステーキ”),
searchAd(“ステーキ”), // 広告情報を取得するメソッドだと思って下さい
Pair::create
)

.subscribeOn(schedulers.io())

.observeOn(AndroidSchedulers.mainThread())
.subscribe(pair -> {
addToListWithBannerIfExist(pair.first, pair.second);
},
throwable -> {
showErrorMessage(t);
}
);
Observable.combineLatest(
searchRecipe(“ステーキ”),
searchAd(“ステーキ”), // 広告情報を取得するメソッドだと思って下さい
Pair::create
)

.subscribeOn(schedulers.io())

.observeOn(AndroidSchedulers.mainThread())
.subscribe(pair -> {
addToListWithBannerIfExist(pair.first, pair.second);
},
throwable -> {
showErrorMessage(t);
}
);
😱
😱
😱
AdObservable(“タマゴ”)
.onErrorReturn(throwable -> AdModel.EmptyData());
public Observable<AdModel> searchAd(String keyword) {
return Observable.create(subscriber -> {
try{

AdModel adModel = adClient.search(keyword);
subscriber.onNext(adModel);
} catch(HttpException e) {

subscriber.onError(e);

})
.onErrorReturn(e -> {
return AdModel.createEmptyData();

});
}
public Observable<AdModel> searchAd(String keyword) {
return Observable.create(subscriber -> {
try{

AdModel adModel = adClient.search(keyword);
subscriber.onNext(adModel);
} catch(HttpException e) {

subscriber.onError(e);

})
.onErrorReturn(e -> {
return AdModel.createEmptyData();

});
}
public Observable<AdModel> searchAd(String keyword) {
return Observable.create(subscriber -> {
try{

AdModel adModel = adClient.search(keyword);
subscriber.onNext(adModel);
} catch(HttpException e) {

subscriber.onError(e);

})
.onErrorReturn(e -> {
return AdModel.createEmptyData();

});
}
public Observable<AdModel> searchAd(String keyword) {
return Observable.create(subscriber -> {
try{

AdModel adModel = adClient.search(keyword);
subscriber.onNext(adModel);
} catch(HttpException e) {

subscriber.onError(e);

})
.onErrorReturn(e -> {
return AdModel.createEmptyData();

});
}
public Observable<AdModel> searchAd(String keyword) {
return Observable.create(subscriber -> {
try{

AdModel adModel = adClient.search(keyword);
subscriber.onNext(adModel);
} catch(HttpException e) {

subscriber.onError(e);

})
.onErrorReturn(e -> {
return AdModel.createEmptyData();

});
}
Observable.combineLatest(
searchRecipe(“ステーキ”),
searchAd(“ステーキ”),
Pair::create
)

.subscribeOn(schedulers.io())

.observeOn(AndroidSchedulers.mainThread())
.subscribe( /* 省略 */ );
Observable.combineLatest(
searchRecipe(“ステーキ”),
searchAd(“ステーキ”),
Pair::create
)

.subscribeOn(schedulers.io())

.observeOn(AndroidSchedulers.mainThread())
.subscribe( /* 省略 */ );
Observable.combineLatest(
searchRecipe(“ステーキ”),
searchAd(“ステーキ”),
Pair::create
)

.subscribeOn(schedulers.io())

.observeOn(AndroidSchedulers.mainThread())
.subscribe( /* 省略 */ );
Observable.combineLatest(
searchRecipe(“ステーキ”),
searchAd(“ステーキ”),
Pair::create
)

.subscribeOn(schedulers.io())

.observeOn(AndroidSchedulers.mainThread())
.subscribe( /* 省略 */ );
Observable.combineLatest(
searchRecipe(“ステーキ”),
searchAd(“ステーキ”),
Pair::create
)

.subscribeOn(schedulers.io())

.observeOn(AndroidSchedulers.mainThread())
.subscribe( /* 省略 */ );
Observable.combineLatest(
searchRecipe(“ステーキ”).subscribeOn(schedulers.io()),
searchAd(“ステーキ”).subscribeOn(schedulers.io()),
Pair::create
)

.subscribeOn(schedulers.io())

.observeOn(AndroidSchedulers.mainThread())
.subscribe( /* 省略 */ );


AdObservable(“タマゴ”)
.retry(1); // 例外が発生した場合1回だけリトライする
AdObservable(“タマゴ”)
.retry((count, throwable) -> count > 2)


public Observable<AdModel> searchAd(String keyword) {
return Observable.create(subscriber -> {
try{

AdModel ad = AdClient.search(keyword);
subscriber.onNext(ad);
} catch(HttpException e) {

subscriber.onError(e);

})
.retry(1)
.onErrorReturn(e -> {
return AdModel.createEmptyData();

});
}
!
!
!


!
!
!
♥
♥
♥


!
!
!
♥
♥
♥
!
!
!
♥
♥
♥
searchRecipe(“ステーキ”)
.flatMap(recipes -> fetchLikedRecipeIds(recipes))
.subscribe(recipeIds -> {})
searchRecipe(“ステーキ”)
.flatMap(recipes -> fetchLikedRecipeIds(recipes))
.subscribe(recipeIds -> {})
searchRecipe(“ステーキ”)
.flatMap(recipes -> fetchLikedRecipeIds(recipes))
.subscribe(recipeIds -> {})
searchRecipe(“ステーキ”)
.flatMap(recipes -> fetchLikedRecipeIds(recipes))
.subscribe(recipeIds -> {})
searchRecipe(“ステーキ”)

.flatMap(recipes -> 

Observable.combineLatest(
Observable.just(recipes), // レシピリストをそのまま渡す

fetchLikedRecipe(recipes)), //レシピリストからLikeしたレシピIdを取得
Pair::create

)

)

.map(this::mergeLikeState) // mapでLike状態をレシピインスタンスに反映させる(省略)
.subscribe(recipes -> {})
searchRecipe(“ステーキ”)

.flatMap(recipes -> 

Observable.combineLatest(
Observable.just(recipes), // レシピリストをそのまま渡す

fetchLikedRecipe(recipes)), //レシピリストからLikeしたレシピIdを取得
Pair::create

)

)

.map(this::mergeLikeState) // mapでLike状態をレシピインスタンスに反映させる(省略)
.subscribe(recipes -> {})
searchRecipe(“ステーキ”)

.flatMap(recipes -> 

Observable.combineLatest(
Observable.just(recipes), // レシピリストをそのまま渡す

fetchLikedRecipe(recipes)), //レシピリストからLikeしたレシピIdを取得
Pair::create

)

)

.map(this::mergeLikeState) // mapでLike状態をレシピインスタンスに反映させる(省略)
.subscribe(recipes -> {})
searchRecipe(“ステーキ”)

.flatMap(recipes -> {

fetchLikedRecipe(recipes)

.map(likeIds -> {

mergeLikeState(recipes, likeIds);

});

}

)
.subscribe(recipes -> {})
public Observable<List<Recipe>> searchRecipeWithLikeState(String keyword) {
searchRecipe(keyword)
.flatMap(recipes ->
Observable.combineLatest(
Observable.just(recipes),
fetchLikedRecipeIds(recipes)),
Pair::create
)
)
.map(this::mergeLikeState)
}

public Func1<List<Recipe>> mergeLikeState(Pair<List<Recipe>, Integer> pair) {

// Like状態をレシピインスタンスに反映させる(省略)

}
!
!
!
♥
♥
♥
!
!
!
♥
♥
♥
!
!
!
♥
♥
♥
!
!
!
♥
♥
♥
!
!
!
♥
♥
♥
!
!
!
♥
♥
♥
!
!
!
♥
♥
♥
!
!
!
♥
♥
♥
!
!
!
♥
♥
♥
!
!
!
♥
♥
♥
!
!
!
♥
♥
♥
!
!
!
♥
♥
♥
!
!
!
♥
♥
♥
Observable.combineLatest(
searchRecipeWithLikeState(“ステーキ”)
.subscribeOn(schedulers.io()),
searchAd(“ステーキ”)
.subscribeOn(schedulers.io()),
Pair::create
)
.compose(bindToLifecycle())

.subscribeOn(schedulers.io())

.observeOn(AndroidSchedulers.mainThread())
.subscribe(pair -> {
addToList(pair.first, pair.second);
},
throwable -> {
showErrorMessage(t);
}
);
!
!
!
♥
♥
♥
Observable.combineLatest(

Observable.just(1),

Observable.just(2),

(i1,i2) -> i1 + i2

);


searchRecipe(“ステーキ”)
.flatMap(recipes -> recipeClient.fetchLikedRecipeIds(recipes))
.subscribe(recipeIds -> {})


public class Tuple3<T1, T2, T3> {

public T1 first; public T2 second; public T3 third;

public Tuple3(T1 first, T2 second, T3 third) {

this.first = first;

this.second = second;

this.third = third;

}

public static <T1, T2, T3> Tuple3<T1, T2, T3> create(T1 t1, T2 t2, T3 t3) {

return new Tuple3<>(t1, t2, t3);

}

}
// in your CustomApplication
public void onCreate(Bundle saveInstanceState){

super.onCreate();
System.setProperty("rx.ring-buffer.size", "32");
}
Single.create(subscriber -> {

subscriber.onSuccess("Hello world");

}).subscribe(text -> {

System.out.println(text);

}, throwable -> {

Crashlytics.logException(e);

});


Completable.create(subscriber -> { 

subscriber.onCompleted()

}).subscribe(throwable -> {

Crashlytics.logException(e);

}, () -> {



});



More Related Content

What's hot

今さら聞けないDiとspring
今さら聞けないDiとspring今さら聞けないDiとspring
今さら聞けないDiとspring土岐 孝平
 
関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐりKazuyuki TAKASE
 
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022Takayuki Shimizukawa
 
C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)Yuki Tamura
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?Moriharu Ohzu
 
ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装infinite_loop
 
async/await のしくみ
async/await のしくみasync/await のしくみ
async/await のしくみ信之 岩永
 
【NGINXセミナー】 Ingressを使ってマイクロサービスの運用を楽にする方法
【NGINXセミナー】 Ingressを使ってマイクロサービスの運用を楽にする方法【NGINXセミナー】 Ingressを使ってマイクロサービスの運用を楽にする方法
【NGINXセミナー】 Ingressを使ってマイクロサービスの運用を楽にする方法NGINX, Inc.
 
GoとDDDでモバイルオーダープラットフォームを 型安全に作り直した話
GoとDDDでモバイルオーダープラットフォームを 型安全に作り直した話GoとDDDでモバイルオーダープラットフォームを 型安全に作り直した話
GoとDDDでモバイルオーダープラットフォームを 型安全に作り直した話Takuya Kikuchi
 
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会Akihiko Matuura
 
純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門Kimikazu Kato
 
MySQL勉強会 クエリチューニング編
MySQL勉強会 クエリチューニング編MySQL勉強会 クエリチューニング編
MySQL勉強会 クエリチューニング編MicroAd, Inc.(Engineer)
 
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだconstexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだGenya Murakami
 
いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪
いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪
いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪Kunihiro TANAKA
 
Gocon2017:Goのロギング周りの考察
Gocon2017:Goのロギング周りの考察Gocon2017:Goのロギング周りの考察
Gocon2017:Goのロギング周りの考察貴仁 大和屋
 
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.kiki utagawa
 
サーバーサイドでの非同期処理で色々やったよ
サーバーサイドでの非同期処理で色々やったよサーバーサイドでの非同期処理で色々やったよ
サーバーサイドでの非同期処理で色々やったよkoji lin
 
Wpfと非同期
Wpfと非同期Wpfと非同期
Wpfと非同期yone64
 

What's hot (20)

今さら聞けないDiとspring
今さら聞けないDiとspring今さら聞けないDiとspring
今さら聞けないDiとspring
 
関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり
 
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022
 
Kotlinアンチパターン
KotlinアンチパターンKotlinアンチパターン
Kotlinアンチパターン
 
C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
 
ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装
 
async/await のしくみ
async/await のしくみasync/await のしくみ
async/await のしくみ
 
【NGINXセミナー】 Ingressを使ってマイクロサービスの運用を楽にする方法
【NGINXセミナー】 Ingressを使ってマイクロサービスの運用を楽にする方法【NGINXセミナー】 Ingressを使ってマイクロサービスの運用を楽にする方法
【NGINXセミナー】 Ingressを使ってマイクロサービスの運用を楽にする方法
 
GoとDDDでモバイルオーダープラットフォームを 型安全に作り直した話
GoとDDDでモバイルオーダープラットフォームを 型安全に作り直した話GoとDDDでモバイルオーダープラットフォームを 型安全に作り直した話
GoとDDDでモバイルオーダープラットフォームを 型安全に作り直した話
 
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
 
純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門
 
MySQL勉強会 クエリチューニング編
MySQL勉強会 クエリチューニング編MySQL勉強会 クエリチューニング編
MySQL勉強会 クエリチューニング編
 
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだconstexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
 
いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪
いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪
いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪
 
Marp Tutorial
Marp TutorialMarp Tutorial
Marp Tutorial
 
Gocon2017:Goのロギング周りの考察
Gocon2017:Goのロギング周りの考察Gocon2017:Goのロギング周りの考察
Gocon2017:Goのロギング周りの考察
 
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
 
サーバーサイドでの非同期処理で色々やったよ
サーバーサイドでの非同期処理で色々やったよサーバーサイドでの非同期処理で色々やったよ
サーバーサイドでの非同期処理で色々やったよ
 
Wpfと非同期
Wpfと非同期Wpfと非同期
Wpfと非同期
 

Recently uploaded

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
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
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
 
"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
 
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
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Manik S Magar
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
The Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdfThe Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdfSeasiaInfotech2
 
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
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostZilliz
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationSafe Software
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 

Recently uploaded (20)

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
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
DMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special EditionDMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special Edition
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
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
 
"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
 
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?
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
The Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdfThe Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdf
 
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)
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptxE-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
 

明日から使えるRxjava頻出パターン (Droid kaigi 2016)