尾递归rxjava 1.2

时间:2019-01-03 20:54:36

标签: recursion kotlin rx-java

我正在使用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也可以这样做,但是我在将数据转换为观察者所需的参数时遇到了问题。

有什么想法吗?

非常感谢!

0 个答案:

没有答案