使用 RxJava 向下传递变量的正确方法是什么?

What is the proper way to pass down variable down the chain with RxJava?

public Single<Content> createContent(final Content content) {
        BackendACL acl = new BackendACL();
        acl.setPublicRead(false);
        acl.setPublicWrite(false);
        content.setAcl(acl);
        return content.create().flatMap(backendEntity -> {
            Content newContent = (Content) backendEntity;
            newContent.setEntityId(backendEntity.getEntityId());
            newContent.setSchema(content.getSchema());
            return Single.just(newContent);
        }).flatMap(content1 -> {
            return content1.setLink("schema", content1.getSchema().getEntityId());
        }).flatMap(isLinked -> {
            // Code section 1
            //return content1.setLink("user", getLoggedInUser().getEntityId());
            return Single.just(true); // just a dummy to  illustrate
        }).flatMap(isLinked -> {
            return Single.just(content);
            // Code section 2
            // should be: return Single.jus(content1);
        });
}

上面的代码中,在代码段1代码段2[=16=中使用content1变量的解决方法是什么]?

在一个运算符和另一个运算符之间,您只能发出一种对象类型。 在您的情况下,您正在向代码部分 1 发出一个布尔值,但您还希望能够访问 Content 实例。 解决方案是将两个值(内容对象和布尔值)包装在一个 class 中并发出 class.

创建一个 class 来包装 Content 的发射和 setLink 的结果。

    class Pair {
        private final Content content;
        private final boolean isLinked;

        private Pair(Content content, boolean isLinked) {
            this.content = content;
            this. isLinked = isLinked;
        }

        public Content getContent() {
            return content;
        }

        public boolean isLinked() {
            return isLinked;
        }
    }

然后更改您的代码以发出 class:

      return content.create().flatMap(backendEntity -> {
            Content newContent = (Content) backendEntity;
            newContent.setEntityId(backendEntity.getEntityId());
            newContent.setSchema(content.getSchema());
            return Single.just(newContent);
        }).flatMap(content1 -> {
            return content1.setLink("schema", content1.getSchema().getEntityId())
                .flatMap(isLinked -> Single.just(new Pair(content1, isLinked)));
        }).flatMap(pair -> {
            // Code section 1
            // ** here you can access pair.getContent() and pair.isLinked()
            return Single.just(true); // just a dummy to  illustrate
        })

Ps:不要创建自己的配对 class,而是检查此 thread. If you are using Kotlin, there is a Pair class.

中的选项之一