[英]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.