使用 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.
中的选项之一
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.
中的选项之一