Хвостовая рекурсия rxjava 1.2 - PullRequest
0 голосов
/ 03 января 2019

Я работаю с некоторыми рекурсивными вызовами в rx java, у меня проблемы с выполнением и успешным достижением рекурсии.

Прежде всего, у меня есть этот метод:

override fun get(context: DCSServiceContext): Single<List<DCSItem?>> {
        val dcsUrl = dcsURL(context.contentIds, context.contentOrigin)
        val httpContext = HttpJsonServiceContextImpl(URL(dcsUrl), context.transaction)
        return httpService.get(httpContext).map {
            val content = it["Content"]
            return@map content.map(dcsItemFactory::create)
        }
    }

Я должен сделать что-то вроде следующего кода:

private fun buildNavItems(dCSServiceContext: DCSServiceContext): Single<MutableList<Item>> {
        return dCSService.get(dCSServiceContext).map { itemsResponse ->
            val items: MutableList<Item> = arrayListOf()
            itemsResponse.forEach { item ->
                val transformedItem = buildItem(item!!)
                if (item?.collections?.get("NavItems") != null) {
                    dCSServiceContext.contentIds = item?.collections?.get("NavItems")

                    //Alternative 2: Recursion to fill the internal items, this code is not been called now.
                    buildNavItems(dCSServiceContext).map { childrenItems ->
                        val section = Section("", "", false,childrenItems )
                        val data = Data(section)
                        val children = Children(data)
                        transformedItem.children = children
                        items.add(transformedItem)
                    }

                } else {
                    val transformedItem = buildItem(item!!)
                    items.add(transformedItem)
                }
            }
            return@map items
            //Single.just(items)
        }
    }

По сути, идея заключается в том, чтобы делать рекурсивные вызовы каждый раз, когда условие:

if (item?.collections?.get("NavItems")

будет истинным, и это может бытьнесколько раз, поэтому мне приходится создавать эти элементы с подэлементами в этих итерациях.

Но теперь у меня возникают проблемы при попытке сделать работу, вызываемую этими вызовами, я знаю, что это можно сделать и с Observable, ноУ меня проблемы с приведением данных к параметрам, которые нужны наблюдателю.

Есть идеи?

Большое спасибо!

...