Java 对于多个Couchbase访问,如何用lambda(包括记录器)替换可观察的匿名内部类?

Java 对于多个Couchbase访问,如何用lambda(包括记录器)替换可观察的匿名内部类?,java,lambda,couchbase,observable,Java,Lambda,Couchbase,Observable,几天前我开始使用Java8,我想用lambda重构一些方法 以下方法用于从Couchbase获取多个文档: public List<JsonDocument> bulkGet(final Collection<Long> ids) { return Observable .from(ids) .flatMap(new Func1<Long, Observable<JsonDocument>>(

几天前我开始使用Java8,我想用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();
}
现在,这是我对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();
}
public List bulkGet(最终集合ID){
可观测回波
.from(ids)
.flatMap((长id)->{
返回bucket().async().get(docId(id))
杜恩先生(
(Throwable-Throwable)->{logger.error(“从Couchbase批量获取id为[“+docId(id)+”]的SenderEmailAddress时出错”);}
).下一个(
(Throwable-Throwable)->{return Observable.empty();}
);
})
托利斯先生()
.toBlocking()
.single();
}
但是Sonarint告诉我应该用方法引用来代替它。但是像Class::method这样的方法引用不可能使用参数,不是吗

顺便说一下,我不应该被允许在lambda中使用我的记录器,对吗? 我该怎么做?
Sonar建议,真的可以像lambda一样重构这个类吗?

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

 Function<In,Out> op = in -> MyClass.doSomething(in);
函数op=in->MyClass.doSomething(in);
其中包含一个参数,相当于

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

当它看到
MyClass::doSomething
时,编译器将看到它需要一个
函数
,并在
MyClass
中寻找一个名为
doSomething
的静态方法,该方法接受一个参数,该参数可以接受
中的
,以及一个可以分配给
Out

的返回类型,您可以在一个方法中重构这个大lambda主体,然后使用对该方法的引用。关于记录器,为什么不能在lambda中使用它?(主题外)
->{expression;}
可以更简单地编写
->expression
。另外,我相信您的
.onErrorResume
不需要lambda:'.onErrorResume(Observable.empty())`顺便说一句,使用lambda还是方法引用的选择主要取决于您的偏好。当有选择时,总是选择最清晰易懂的风格。有时方法引用可以隐藏正在发生的事情,所以不要盲目地遵循SolarLink。如果你能关掉那张支票,我会去的。
 Function<In,Out> op = MyClass::doSomething;