繁体   English   中英

如何通过 lambda 替换 Observable 匿名内部类(包括记录器)以进行多个 Couchbase 访问?

[英]How can I replace an Observable anonymous inner class by lambda, including a logger, for multiple Couchbase access?

几天前我开始使用 java 8,我想使用 lambda 重构一些方法。

以下方法用于从 Couchbase 获取许多文档:

public List<JsonDocument> bulkGet(final Collection<Long> ids) {
    return Observable
            .from(ids)
            .flatMap(new Func1<Long, Observable<JsonDocument>>() {
                @Override
                public Observable<JsonDocument> call(final Long id) {
                    return bucket().async().get(docId(id)).doOnError(new Action1<Throwable>(){
                        @Override
                        public void call(Throwable throwable) {
                            logger.error("Error while bulk fetching SenderEmailAddress with id [" + docId(id) + "] from Couchbase.");
                        }
                    }).onErrorResumeNext(new Func1<Throwable, Observable<JsonDocument>>(){
                        @Override
                        public Observable<JsonDocument> call(Throwable throwable) {
                            return Observable.empty();
                        }
                    } );
                }
            })
            .toList()
            .toBlocking()
            .single();
}

这是上下文:

private static final Logger logger =  LoggerFactory.getLogger(SenderNameRepositoryCouchbase.class);

public String docId(Long entityId) {
    return CouchbaseBucketFactory.APPLI_PREFIX + DOC_PREFIX + entityId;
}

现在,这是我使用 lambdas 重构的方法:

public List<JsonDocument> bulkGet(final Collection<Long> ids) {
    return Observable
        .from(ids)
        .flatMap((Long id) -> {
            return bucket().async().get(docId(id))
                .doOnError(
                    (Throwable throwable) -> { logger.error("Error while bulk fetching SenderEmailAddress with id [" + docId(id) + "] from Couchbase."); }
                ).onErrorResumeNext(
                    (Throwable throwable) -> { return Observable.empty(); }
                );
        })
        .toList()
        .toBlocking()
        .single();
}

但是 SonarLint 告诉我应该用方法引用替换它。 但是不可能使用像 Class::method 这样的方法引用和参数,不是吗?

顺便说一句,我不应该被允许在 lambda 中使用我的记录器,对吗? 我怎样才能做到这一点 ? 真的有可能像 Sonar 建议的那样用 lambda 重构这个类吗?

方法引用确实匹配接受参数的函数类型。 编译器将找到具有指定名称的方法,其参数和返回类型与所调用的功能接口兼容。 例如对于静态方法,

 Function<In,Out> op = in -> MyClass.doSomething(in);

它采用一个参数,相当于

 Function<In,Out> op = MyClass::doSomething;

当它看到MyClass::doSomething ,编译器会看到它需要一个Function<In,Out>并在MyClass寻找一个名为doSomething的静态方法,它接受一个可以接受In的参数,以及一个可以分配的返回类型到一个Out

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM