Java:如何使用Lamda进行重写-可能会引发异常

时间:2018-11-30 17:01:15

标签: java

如何通过Java Lambda重写它?

此问题与“ Lambda表达式和通用方法”问题不同。问题是由于引发异常。

public Observable<String> getUserInfo() {
    return Observable.create(new ObservableOnSubscribe<String>() {
        @Override
        public void subscribe(ObservableEmitter<String> emitter) throws Exception {
            try {
                emitter.onNext( getPlayerInfo());
                emitter.onComplete();
            } catch (Exception e) {
                emitter.onError(e);
            }
        }
    }).subscribeOn(Schedulers.io())
      .observeOn(AndroidSchedulers.mainThread());
}

当我通过普通的Lambda重写此代码时,会出现此错误:

  

不兼容的类型:必需:可观察的。发现:   可观察的

这是我尝试的:

public Observable<String> getUserInfo() {
    return Observable.create( emitter -> {
            try {
                emitter.onNext(getPlayerInfo();
                emitter.onComplete();
            } catch (Exception e) {
                emitter.onError(e);
            }
        }).subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread());
}

2 个答案:

答案 0 :(得分:3)

编译器的推理引擎无法确定Observable的类型参数,因此您需要明确指定它:

return Observable.<String>create( emitter -> {

答案 1 :(得分:1)

类型推断失败的原因特别是由于对subscriptionOn和observeOn的跟踪调用。另一个解决方案是引入中间方法或变量,例如:

private Observable<String> getUserInfo() {
    Observable<String> userInfo = Observable.create( emitter -> {
            try {
                emitter.onNext(getPlayerInfo();
                emitter.onComplete();
            } catch (Exception e) {
                emitter.onError(e);
            }
        });

    return userInfo
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread());
}