Java 对于多个Couchbase访问,如何用lambda(包括记录器)替换可观察的匿名内部类?
几天前我开始使用Java8,我想用lambda重构一些方法 以下方法用于从Couchbase获取多个文档: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>>(
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;