Maybe
andよりもJavaRx 2の型を使用するためのより良い/より慣用的な方法はflatMap
ありtry/catch
ますか? 次の例では、 を受け取りMaybe<User>
、フライトのランダム チケットを予約しようとします。ユーザーが存在しない場合は、空の を返しますObservable
。
fun bookRandomTicketFor(userId: UUID): Observable<Ticket> {
val agencies = travelAgents() // Observable<TravelAgency>
val user = findById(userId) // Maybe<User>
val location = locate() // Observable<GeoLocation>
return Observable
.just(user.toObservable())
.flatMap { usr ->
try {
usr.zipWith(location, { aUser, location ->
agencies
.flatMap { agency ->
agency
.search(aUser, location) // Observable<Flight>.
.toList() // Convert to List<Flight>.
.toObservable() // And to Observable<List<Flight>>.
.flatMap { flights -> // So it can be shuffled,
Observable.just( // giving a random order.
shuffle(flights as MutableList<Flight>)[0]
)
}
}.firstElement() // Now take the first randomly shuffled Flight.
}).flatMap { flight ->
book(user.toObservable(), flight.toObservable())
}
} catch (ex: Exception) {
Observable.empty<Ticket>()
}
}
.doOnSubscribe { Logger.log("Random ticket: start for $userId") }
.doOnComplete { Logger.log("Random ticket: exit for $userId") }
}
Maybe<User>
を に変換し、とができるObservable
から開始する必要があるのは、少しごちゃごちゃしているようです。これを行うためのよりきちんとしたアプローチがあるかどうか疑問に思っていますか?Observable<Observable<User>>
flatMap
try/catch