簡體   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