gpt4 book ai didi

java - 如何用 lambda 替换 Observable 匿名内部类(包括记录器)以进行多个 Couchbase 访问?

转载 作者:行者123 更新时间:2023-11-30 07:26:36 25 4
gpt4 key购买 nike

几天前我开始使用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;
}

现在,这是我用 lambda 重构的方法:

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 重构这个类吗?

最佳答案

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

 Function<In,Out> op = in -> MyClass.doSomething(in);

只有一个参数,相当于

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

当它看到MyClass::doSomething时,编译器会发现它需要 Function<In,Out>并在 MyClass 中查找静态方法叫doSomething它采用一个可以接受 In 的参数,以及可以分配给 Out 的返回类型.

关于java - 如何用 lambda 替换 Observable 匿名内部类(包括记录器)以进行多个 Couchbase 访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36750398/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com