如何将方法作为带参数的函数传递?
How to pass method as function with parameters?
我正在使用 spring-webflux
异步调用外部网络服务,例如:
String param1;
int param2;
webClient.send(...)
.exchange()
.doOnSuccess(rsp -> processResponse(rsp))
.onErrorMap(ex -> processException(ex, param1, param2));
现在我想将实际的发送重构为一个更通用的方法,调用者应该为成功+错误函数提供一个参数。但是怎么办?
public Mono send(Function success, Function error) {
return webClient.send(...)
.exchange()
.doOnSuccess(success)
.onErrorMap(error);
}
问题:我现在如何将函数传递给我的泛型方法?
应该是类似下面的伪代码,但是函数到底要怎么写呢?
public void caller() {
String param1;
int param2;
send(
rsp -> processResponse(rsp),
ex -> processException(ex, param1, param2)
);
}
如果您确定要使用 onErrorMap()
(将一个异常映射到另一个异常),那么:
public Mono<ClientResponse> send(Consumer<? super ClientResponse> success, Function<? super Throwable, ? extends Throwable> error) {
return webClient()
.get()
.uri("http://example.com/")
.exchange()
.doOnSuccess(success)
.onErrorMap(error);
}
send(cr -> processResponse(cr), ex -> mapToAnotherException(ex));
...但听起来您想实际添加一个错误的副作用,而不是 doOnError()
:
public Mono<ClientResponse> send(Consumer<? super ClientResponse> success, Consumer<? super Throwable> error) {
return webClient()
.get()
.uri("http://example.com/")
.exchange()
.doOnSuccess(success)
.doOnError(error);
}
send(cr -> processResponse(cr), ex -> processException(ex));
但是请注意,exchange()
现在已弃用 - 您现在通常会使用 exchangeToMono()
,提供一个 return 来自客户端响应的 Mono<Foo>
的函数。 (如果你真的想像以前一样只 return a Mono<ClientResponse>
,你可以只做 .exchangeToMono(Mono::just)
。)
我正在使用 spring-webflux
异步调用外部网络服务,例如:
String param1;
int param2;
webClient.send(...)
.exchange()
.doOnSuccess(rsp -> processResponse(rsp))
.onErrorMap(ex -> processException(ex, param1, param2));
现在我想将实际的发送重构为一个更通用的方法,调用者应该为成功+错误函数提供一个参数。但是怎么办?
public Mono send(Function success, Function error) {
return webClient.send(...)
.exchange()
.doOnSuccess(success)
.onErrorMap(error);
}
问题:我现在如何将函数传递给我的泛型方法?
应该是类似下面的伪代码,但是函数到底要怎么写呢?
public void caller() {
String param1;
int param2;
send(
rsp -> processResponse(rsp),
ex -> processException(ex, param1, param2)
);
}
如果您确定要使用 onErrorMap()
(将一个异常映射到另一个异常),那么:
public Mono<ClientResponse> send(Consumer<? super ClientResponse> success, Function<? super Throwable, ? extends Throwable> error) {
return webClient()
.get()
.uri("http://example.com/")
.exchange()
.doOnSuccess(success)
.onErrorMap(error);
}
send(cr -> processResponse(cr), ex -> mapToAnotherException(ex));
...但听起来您想实际添加一个错误的副作用,而不是 doOnError()
:
public Mono<ClientResponse> send(Consumer<? super ClientResponse> success, Consumer<? super Throwable> error) {
return webClient()
.get()
.uri("http://example.com/")
.exchange()
.doOnSuccess(success)
.doOnError(error);
}
send(cr -> processResponse(cr), ex -> processException(ex));
但是请注意,exchange()
现在已弃用 - 您现在通常会使用 exchangeToMono()
,提供一个 return 来自客户端响应的 Mono<Foo>
的函数。 (如果你真的想像以前一样只 return a Mono<ClientResponse>
,你可以只做 .exchangeToMono(Mono::just)
。)