2

Maybeandよりも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>>flatMaptry/catch

4

0 に答える 0