gpt4 book ai didi

java - 从功能接口(interface)中的java 8 Map Reduce中断或返回

转载 作者:行者123 更新时间:2023-12-02 09:18:16 24 4
gpt4 key购买 nike

我有一个 java 8 功能接口(interface),它接受应用于对象的 validator 列表并返回验证结果。验证结果在reduce阶段累积。代码如下:

public interface LogicalTableValidator extends Function<LogicalTable, ValidationResult> {

static LogicalTableValidator addAll(LogicalTableValidator... validators) {

// Need to break out of this validator stream, based on the criticality of a particular validation error
return logicalTable -> Arrays.stream(validators).map(v -> v.apply(logicalTable))
.reduce(new ValidationResult(logicalTable.getUid()), (validationResult, currentResult) -> {
validationResult.addValidationMessages(currentResult.getValidationMessages());
return validationResult;
});

}

}

从这里调用此验证逻辑

LogicalTableValidator logicalTableValidators = LogicalTableValidator.addAll(getValidators());
List<ValidationResult> ltValidationResults = logicalTables.stream()
.parallel()
.map(logicalTableValidators)
.collect(Collectors.toList());

我面临的问题是,我无法有条件地打破验证逻辑。当我在逻辑对象上应用 validator 时,就会出现这种情况,如果验证因严重错误而失败,我不需要运行其余的 validator 。相反,我需要立即停止验证过程。

解决方法是不使用 lambda 表达式进行验证,而是使用以下代码。

        return new LogicalTableValidator() {

@Override
public ValidationResult apply(LogicalTable t) {
ValidationResult result = new ValidationResult(t.getUid());
for (LogicalTableValidator validator : validators) {
ValidationResult currentResult = validator.apply(t);
List<ValidationMessage> messages = currentResult.getValidationMessages();
Boolean exit = false;
for (ValidationMessage message : messages) {
if(StringUtils.equalsIgnoreCase(message.getSeverity(), "1")) {
exit = true;
break;
}
}
result.addValidationMessages(currentResult.getValidationMessages());
if (exit) break;
}
return result;
}

};

看来,在函数式接口(interface)中不使用 lambda 表达式,违背了使用函数式接口(interface)的目的,但我无法找到一种有条件地跳出验证循环的方法。我可以使用任何替代方案吗?这段代码是否应该以不同的方式构建?

最佳答案

您可以尝试如下所示的操作。在peek中,它收集ValidationMessages。在 filterfindFirst 中,它会在第一条错误消息后停止。它是评论中提到的 takeWhile 的替代品,您也可以查看 this .

public interface LogicalTableValidator extends Function<LogicalTable, ValidationResult> {

static LogicalTableValidator addAll(LogicalTableValidator... validators) {

logicalTable -> {
ValidationResult result = new ValidationResult(logicalTable.getUid());
Arrays.stream(validators).map(v -> v.apply(logicalTable))
.peek(currentResult -> result.addValidationMessages(currentResult.getValidationMessages()))
.filter(currentResult -> currentResult.getValidationMessages().stream()
.filter(message -> StringUtils.equalsIgnoreCase(message.getSeverity(), "1"))
.count() > 0)
.findFirst()
.orElse(null);
return result;
}
}

}

关于java - 从功能接口(interface)中的java 8 Map Reduce中断或返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58859629/

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