我试图在我的Java应用程序中探索Vavr库的使用。我正在尝试使用Vavr库的Match.of()构造来减少if-else梯子。
下面是我编写的一段代码:
Match(Option.of(clientId)).of(
Case($None(), run(() -> {
metricsService.recordValidationStageMetrics(CLIENT_ID_NOT_PRESENT, type, BLANK);
log.error("Client ID not present in the request header: [{}]", clientId);
throw new ValidationException(EX_REQUEST_CLIENT_ID_EMPTY);
})),
Case($Some($(StringUtils::isBlank)), run(() -> {
metricsService.recordValidationStageMetrics(CLIENT_ID_NOT_PRESENT, type, BLANK);
log.error("Client ID not present in the request header: [{}]", clientId);
throw new ValidationException(EX_REQUEST_CLIENT_ID_EMPTY);
})),
Case($(), run(() -> {
if (isClientIdNotAllowed(clientId)) {
log.error(LOG_CLIENT_ID_NOT_ALLOWED, clientId);
metricsService.recordValidationStageMetrics(CLIENT_ID_NOT_ALLOWED, type, clientId);
throw new ValidationException(EX_ALLOWED_CLIENT_ID_ERROR);
}
}))
);这里的问题是,Option总是匹配第一个Case语句。即使clientId是非空的,它也被验证为None并抛出异常。
所以问题是:
,
发布于 2022-06-22 13:30:55
实际上--就我所记得的--您需要在run前面加上() ->,这表示使用的Case的第二个参数的Supplier变体。否则,将急切地对其进行评估,因此将运行第一个Case。
以下代码工作正常:
package lol;
import static io.vavr.API.$;
import static io.vavr.API.Case;
import static io.vavr.API.Match;
import static io.vavr.API.run;
import static io.vavr.Patterns.$None;
import static io.vavr.Patterns.$Some;
import io.vavr.control.Option;
public class Lol {
public static void main(String[] args) {
String val = "lol";
Match(Option.of(val)).of(
Case($None(), () -> run(() -> {
System.out.println(1);
throw new IllegalArgumentException("null");
})),
Case($Some($(String::isEmpty)), () -> run(() -> {
System.out.println(2);
throw new IllegalArgumentException("empty");
})),
Case($(), () -> run(() -> {
System.out.println(3);
if ("lol".equals(val)) {
throw new IllegalArgumentException("lol");
}
}))
)
;
}
}尝试删除() ->,无论输入是什么,您都将开始获得匹配的第一个Case。
我能不能写得更干净。这取决于您使用的java版本。如果使用最新版本,我将其视为一个switch语句或模式匹配。
https://stackoverflow.com/questions/72699405
复制相似问题