java - 如何将方法作为带参数的函数传递?
问题描述
我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()
返回 a 的函数。Mono<Foo>
(如果你真的想像以前一样返回 a Mono<ClientResponse>
,你可以这样做.exchangeToMono(Mono::just)
。)
推荐阅读
- r - 我正在尝试按照创建自己的 R 包的指南说明在 Windows 10 上制作 rcpp 包
- android - 如何使用launchFragmentInHiltContainer将视图模型传递给片段
- arrays - 使用数组从json数组中获取数据?
- mysql - Ubuntu 的 MySQL 工作台中没有模式面板
- mongodb - 创建具有交替 IP 地址的服务器副本集
- php - 错误的 php 和 XML 声明只允许在文档的开头
- typescript - 打字稿反应道具验证不起作用
- reactjs - Employee.map 不是函数
- c# - 是否可以指示 C# 编译器不要内联常量?
- reactjs - 尽管我添加了链接标签,但无法重定向到 ReactJS 中的错误页面