我如何用 lambda 替换 Observable 匿名内部 class,包括一个记录器,用于多个 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 重构这个 class 吗?
方法引用与接受参数的函数类型相匹配。编译器将找到一个具有指定名称的方法,其参数和 return 类型与调用的功能接口兼容。例如对于静态方法,
Function<In,Out> op = in -> MyClass.doSomething(in);
带一个参数,等价于
Function<In,Out> op = MyClass::doSomething;
当它看到 MyClass::doSomething
时,编译器将看到它需要一个 Function<In,Out>
并在 MyClass
中寻找一个名为 doSomething
的静态方法,该方法接受一个参数可以接受一个 In
和一个可以分配给 Out
.
的 return 类型
我几天前开始使用 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 重构这个 class 吗?
方法引用与接受参数的函数类型相匹配。编译器将找到一个具有指定名称的方法,其参数和 return 类型与调用的功能接口兼容。例如对于静态方法,
Function<In,Out> op = in -> MyClass.doSomething(in);
带一个参数,等价于
Function<In,Out> op = MyClass::doSomething;
当它看到 MyClass::doSomething
时,编译器将看到它需要一个 Function<In,Out>
并在 MyClass
中寻找一个名为 doSomething
的静态方法,该方法接受一个参数可以接受一个 In
和一个可以分配给 Out
.