将Kotlin的RxJava方法转为Java遇困惑:Lambda返回值位置不明
没问题,我来帮你把这段Kotlin代码的逻辑拆明白,再转换成对应的Java实现,顺便把你困惑的返回值问题讲清楚~
先拆解Kotlin代码的返回值逻辑
你困惑的Lambda返回值,在Kotlin里有个很实用的规则:如果Lambda是多行代码块,最后一行的表达式会自动作为这个Lambda的返回值,不需要额外写return(除非是带标签的返回)。
看你这段代码里的核心部分:
Single.fromCallable<State>({ update(messageId, it, State.COMPLETED) State.COMPLETED })
这里的Lambda里,第一行是调用update方法(不管这个方法有没有返回值,都会被忽略),第二行的State.COMPLETED就是这个Lambda的返回值——也就是说Single.fromCallable最终会发射这个State.COMPLETED对象。
整个getMessage方法的执行链路是:
- 调用
repository.fetchMessage(messageId)拿到Single<Response> - 通过
flatMap把每个Response转换成一个发射State.COMPLETED的Single<State> - 最后把
Single<State>转成Observable<State>返回
对应的Java实现
下面是适配你环境的Java代码,分两种写法供你选择:
方式1:Java 8 Lambda风格(更简洁,推荐)
如果你的项目已经启用Java 8特性(Android Studio 3.1是支持的),可以用这种写法:
private Observable<State> getMessage(String messageId) { return repository.fetchMessage(messageId) .flatMap(response -> Single.fromCallable(() -> { // 对应Kotlin里的update调用 update(messageId, response, State.COMPLETED); // 明确返回State.COMPLETED,对应Kotlin里的最后一行自动返回 return State.COMPLETED; })) .toObservable(); }
方式2:Java 7及以下匿名内部类写法
如果你的项目还没开启Java 8支持,就用这种兼容写法:
private Observable<State> getMessage(String messageId) { return repository.fetchMessage(messageId) .flatMap(new Function<Response, SingleSource<? extends State>>() { @Override public SingleSource<? extends State> apply(Response response) throws Exception { return Single.fromCallable(new Callable<State>() { @Override public State call() throws Exception { update(messageId, response, State.COMPLETED); return State.COMPLETED; } }); } }) .toObservable(); }
关键对应点说明
- Kotlin里的
it是Lambda的默认参数名,在Java里我们显式命名为response,语义更清晰 - Kotlin Lambda的自动返回值,在Java里必须用
return关键字明确声明 - 两段代码的核心逻辑和原Kotlin代码完全一致:先请求消息,更新状态,最终返回发射
State.COMPLETED的Observable
内容的提问来源于stack exchange,提问作者ant2009
相关产品推荐
相关产品推荐

