gpt4 book ai didi

java - rxjava 使用 Single 在 doOnSuccess 中传递参数

转载 作者:行者123 更新时间:2023-12-02 02:17:56 25 4
gpt4 key购买 nike

Java 8
io.reactivex:rxjava:1.3.6
kotlin 1.2.21

我正在尝试使用 Single 在 doOnSuccess 中传递参数。

但是,我遇到了一个错误,我似乎无法解决该错误。

class TranslateInteractor(val repository: Respository) {
fun requestNetworkTranslated(message: String): Completable {
return repository.fetchTranslation(message)
.doOnSuccess { handleTranslationResponse(message, it) }.toCompletable()
}

private fun handleTranslationResponse(message, String, translatedResponse: TranslatedResponse) {
saveTranslation(
"",
translatedResponse.content,
translatedResponse.translationEngine)
}

private fun saveTranslation(message: String, content: String, engine: String) {
/* Save to local storage */
}
}

错误出现在 .doOnSuccess 中。因为我想将消息传递给handleTranslationResponse。

Type mismatch: inferred type is String but TranslatedResponse was expected

如何将消息以及从 TranslatedResponse 获取的内容传递回 HandleTranslationResponse?

存储库是一个返回单个的java类:

public class Respository {
private NetworkAPI networkAPI;

public Single<TranslatedResponse> fetchTranslation(final String message) {
return networkAPI.fetchTranslation(new TranslateRequest(message));
}
}

我在 Kotlin 中的数据类是:

data class TranslatedResponse(
val content: String,
val translationEngine: String)

并请求

data class TranslateRequest(val message: String)

对于networkAPI,我在java代码片段中有以下内容:

public interface NetworkAPI {
Single<TranslatedResponse> fetchTranslation(TranslateRequest request);
}

非常感谢您的建议,

最佳答案

您不能这样做的原因是 doOnSucess 仅采用一个参数,即 Repository 返回的任何参数。

您需要以某种方式将原始消息添加到Repository 返回的响应中。有几个选项(例如使用Pair或新的数据类)

一个例子:

data class Translation(
val originalMessage: String,
val translatedMessage: TranslationResponse
)

现在您的存储库变为:

public class Respository {
private NetworkAPI networkAPI;

public Single<TranslatedResponse> fetchTranslation(final String message) {
return new Translation(
message,
networkAPI.fetchTranslation(new TranslateRequest(message)
);
}
}

最后,handleTranslationResponse 现在采用 Translation 来代替,这使您的交互器看起来像:

class TranslateInteractor(val repository: Respository) {
fun requestNetworkTranslated(message: String): Completable {
return repository.fetchTranslation(message)
.doOnSuccess { handleTranslationResponse(it) }.toCompletable()
}

private fun handleTranslationResponse(translation: Translation) {
saveTranslation(
translation.originalMessage,
translation.translatedMessage.content,
translation.translatedMessage.translationEngine)
}

private fun saveTranslation(message: String, content: String, engine: String) {
// do whatever you want!
}
}

关于java - rxjava 使用 Single 在 doOnSuccess 中传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49011176/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com