我正在尝试弄清楚如何在Java 8 Stream上实现自定义的中间操作。看来我被封锁了:(
具体来说,我想获取一个流并返回直到并包括具有特定值的第一个条目的每个条目。而且我想在此之后停止生成任何内容-使其短路。
它正在对输入数据进行一系列验证检查。如果有一个错误,我想停在第一个错误上,但是我想在路上整理警告。而且由于这些验证检查可能很昂贵-例如涉及数据库查找-我只想运行所需的最小设置。
因此,代码将类似于:
Optional<ValidationResult> result = validators.stream()
.map(validator -> validator.validate(data))
.takeUntil(result -> result.isError()) // This is the bit I can't do
.reduce(new ValidationResult(), ::mergeResults);
Run Code Online (Sandbox Code Playgroud)
这似乎是我应该可以做一些与ReferencePipeline.StatefulOp,不同之处在于它的所有包范围,所以我不能扩展。所以我想知道实现这一目标的正确方法是什么?还是有可能?
还要注意-这需要使用Java 8,而不是9+,因为由于各种不相关的原因我们还没有出现。
干杯
你可以用一个技巧来做到这一点:
List<ValidationResult> res = new ArrayList<>(); // Can modify it with your `mergeResults` instead of list
Optional<ValidationResult> result = validators.stream()
.map(validator -> validator.validate(data))
.map(v -> {
res.add(v);
return v;
})
.filter(result -> result.isError())
.findFirst();
Run Code Online (Sandbox Code Playgroud)
遗嘱List<ValidationResult> res包含您感兴趣的价值观。
| 归档时间: |
|
| 查看次数: |
171 次 |
| 最近记录: |