project-reactor - 如何以反应器方式编写快捷循环
问题描述
我有一个如下所示的非反应堆时尚代码,迭代检查器列表,如果任何检查器返回 false,则快捷方式返回“BAD”:
public static String oldWay() {
List<Checker> checkers = new ArrayList<>();
String param = "blahblah";
for (Checker checker : checkers) {
if (!checker.check(param)) {
return "BAD";
}
}
return "GOOD";
}
interface Checker {
boolean check(String str);
Mono<Boolean> reactorCheck(String str);
}
如何将上面的代码转换为反应堆方式?
public static Mono<String> newWay() {
// TODO
return Mono.just("GOOD");
}
解决方案
打开它并使用Flux#all(Predicate)
,但输入 Flux 是Checker
您要测试的所有内容之一:
//simplified Checker version for this example
interface Checker extends Predicate<String> {}
@Test
public void allChecks() {
//given the checks you want to apply, as a Flux<Checker>...
Checker lengthy = s -> s.length() > 3;
Checker startsWithA = s -> s.toUpperCase().startsWith("A");
Flux<Checker> checks = Flux.just(lengthy, startsWithA);
//...and given the param String you want to check...
String param = "Boooooh";
//... verify that _all_ checkers match the predicate that "param passes the checker"
Mono<String> allChecks = checks.all(checker -> checker.test(param))
//and map that result to GOOD or BAD
.map(allMatch -> allMatch ? "GOOD" : "BAD");
StepVerifier.create(allChecks)
.expectNext("BAD")
.verifyComplete();
//variant when multiple params to test:
Flux<String> params = Flux.just("Booooh", "Always", "Ace");
Flux<String> multiParamChecks = params.flatMap(p -> checks
.all(checker -> checker.test(p))
.map(valid -> p + (valid ? " GOOD" : " BAD"))
);
StepVerifier.create(multiParamChecks)
.expectNext("Booooh BAD")
.expectNext("Always GOOD")
.expectNext("Ace BAD")
.verifyComplete();
}
推荐阅读
- python - 我们可以说 python 脚本与 shell 脚本相同吗?
- r - 这段代码计算R中向量之间的角度有什么问题
- swift - 如何将我的应用程序图标放入 iOS 警报窗口
- c++ - 保存包含字母和数字的输入时,它们将作为循环的两个不同迭代运行
- reactjs - 我在 Laravel Mix 中使用 React 路由器刷新浏览器时收到错误 404
- firebase - RN Firebase - Android 上的 okhttp3 版本不匹配
- node.js - 如何在每次提交时自动将服务器上的 git 存储库克隆到另一个文件夹
- java - 用循环中断程序
- bash - travis 成功后自动合并拉取请求
- swift - 使用断点Swift时查找变量的值