gpt4 book ai didi

java - 简化的 Java 单行验证、赋值和返回

转载 作者:行者123 更新时间:2023-12-03 07:07:35 26 4
gpt4 key购买 nike

我想简化在方法启动时执行的以下 Java 8 block :

public void handle(Context ctx) {
String param = ctx.getParam(name);
if (!Validation.validate(param)) {
ctx.markError().end();
return;
}
... do the same with other params

... finally, busines logic on params
}

许多参数都会重复此操作。我希望能够使用 Java 8 语法更流畅地编写此 block ,并使用尽可能少的字符。这里的问题是我们有一个赋值和方法流程中断(返回)。

我正在寻找类似的东西:

if (Validator.on(ctx).param("instanceId")) return;

但是,我们在这里缺少一项作业。我尝试使用一些Consumer,但param必须(有效)final。像(在sudo中):

if (Validator.on(ctx).param("instanceId").into(param)) return;
if (Validator.on(ctx).param("instanceId", value -> param = value) return;

(请注意,ctx.end() 被包裹在里面)。

当然,这在 Java 中是行不通的。有什么想法吗?

注意:我控制着代码,即这里没有使用第三方。

编辑:如果计算机可以理解简单的英语,我会说:

Validate parameter name of context; if it is valid, assign it to a param; if not, exit the method. Please :)

EDIT2:它不需要是 Java 8!我的意思是,允许使用 Java 8 技巧,但这不是强制性的。

最佳答案

问题源于忽视了早期的 return只是条件的简写,例如而不是

if (!Validation.validate(param)) {
ctx.markError().end();
return;
}
... business logic on param

你也可以写

if (!Validation.validate(param)) {
ctx.markError().end();
} else {
... business logic on param
}

因此,您的所有验证框架需要支持的是应该在成功情况下执行的操作,指定为 Consumer<String>BiConsumer<Context,String> ,取决于上下文是否需要。然后,用例可能如下所示:

public void handle(Context ctx) {
Validator.on(ctx).param("instanceId").ifValid( param -> {
... business logic on param
});
}

public void handle(Context ctx) {
Validator.on(ctx).param("instanceId").ifValid( (context,param) -> {
... business logic on param
});
}

如果需要上下文。原则上,该操作可以访问 ctx如果需要上下文,但您可能希望支持如下用例:

public void handle(Context ctx) {
Validator.on(ctx).param("instanceId").ifValid(this::handleValidated);
}
private void handleValidated(Context ctx, String param) {
... business logic on param
}

仅适用于 BiConsumer支持。除此之外,非捕获 lambda 表达式的效率稍高一些。

<小时/>

现在你添加了支持多个参数的想法,它不再那么简单或简洁了。一般来说,这个想法适用于捕获 lambda,例如

public void handle(Context ctx) {
Validator.on(ctx).param("instanceId").ifValid( param ->
Validator.on(ctx).param("anotherParam").ifValid( param2 ->
Validator.on(ctx).param("yetOneMore").ifValid( param3 -> {
... business logic on param, param2, param3
})));
}

这可以通过提供预先配置了上下文的 validator 作为 BiConsumer 的参数来改进。 :

public void handle(Context ctx) {
Validator.on(ctx).param("instanceId").ifValid( (v,param) ->
v.param("anotherParam").ifValid( (v,param2) ->
v.param("yetOneMore").ifValid( (v,param3) -> {
... business logic on param, param2, param3
})));
}

您可以自己决定这是否是一个可行的解决方案......

关于java - 简化的 Java 单行验证、赋值和返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35161668/

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