我用Java编写了以下代码块:
public mainFunction() {
...
if (!functionA(data1, data2)) {
return new Left<>(Reason.INVALID_RULE);
}
if (!functionB(data1, data2)) {
return new Left<>(FAILURE.INVALID_ID);
}
...there are a few if clauses like above...
}
private boolean functionA(Data1 data1, Data2 data2) {
if(StringUtils.isNotBlank(data1.getAttr1)) {
data2.setAttr1(data1.getAttr1);
return true;
}
return false;
}
private boolean functionA(Data1 data1, Data2 data2) {
try{
data2.setAttr1(Attr2Enum.fromValue(data1.getAttr1));
return true;
} catch (Exception e) {
return false;
}
}现在,我的问题是,我可以使用Java8压缩它们吗?
发布于 2021-05-31 19:28:26
有多种方法可以做到这一点。我试图创建一个可以执行这种验证链的Validator接口。虽然这不是一个完美的解决方案,但它可能会给你一个开始的想法。这是一个非常通用的解决方案(可以使用更通用的?超级和?扩展-您可以自己尝试)
代码:
package pecs;
import javafx.util.Pair;
public class Chaining {
public static void main(String[] args) {
Validation<Integer, String, Message> validation = (a, b, c) -> {
return new Pair(a > 30, new Message("a should not be greater than 30"));
};
Validation<Integer, String, Message> validation2 = (a, b, c) -> {
return new Pair(a > 20, new Message("a should not be greater than 20"));
};
Validation<Integer, String, Message> validation3 = (a, b, c) -> {
return new Pair(a > 10, new Message("a should not be greater than 10"));
};
Validation<Integer, String, Message> validation4 = (a, b, c) -> {
return new Pair(a > 5, new Message("a should not be greater than 5"));
};
//One way to call
Validation<Integer, String, Message> validator = validation
.and(validation2)
.and(validation3)
.and(validation4);
System.out.println(validator.validate(4, "A00", 0));
System.out.println(validator.validate(9, "A00", 0));
System.out.println(validator.validate(11, "A00", 0));
System.out.println(validator.validate(21, "A00", 0));
System.out.println(validator.validate(31, "A00", 0));
//Another way to call
Pair<Boolean, Message> pair = validation
.and(validation2)
.and(validation3)
.and(validation4)
.validate(4, "String", 0);
if(pair.getKey() == false) {
System.out.println("All Validation successful");
} else {
System.out.println(pair);
}
}
}代码中使用的验证器接口:
package pecs;
import javafx.util.Pair;
import java.util.Objects;
@FunctionalInterface
public interface Validation<A, B, C> {
Pair<Boolean, C> validate(A a, B b, int count);
default Validation<A, B, C> and(Validation<A, B, C> other) {
Objects.requireNonNull(other);
return (a, b, c) -> {
// System.out.println("c=" + c);
Pair<Boolean, C> validate = validate(a, b, c+1);
if (validate.getKey() == true) {
return validate;
} else {
//Termination condition.
if(c == 0) {
Pair<Boolean, C> pair = other.validate(a, b, c);
if(pair.getKey() == false) {
return new Pair<>(false, null);
} else {
return pair;
}
} else {
return other.validate(a, b, c);
}
}
};
}
}请看一看,如果有任何改进建议。还有许多其他方法可以进行验证。例如,检查这个链接:https://dzone.com/articles/server-side-validator-using-functional-interfaces
https://stackoverflow.com/questions/66667017
复制相似问题