Java 中的自定义或操作
Custom or operation in Java
对于 Java 中的项目,我创建了一个自定义布尔值 class(名为 Result),它可以具有三个值:True、False 或 Undefined。
我定义了两个函数:"or" 和 "and",规则是:
public static Result or(Result r1, Result r2) {
if(r1.isTrue() || r2.isTrue()){
return V(); //new Result with value "True";
} else if(r1.isUndefined() || r2.isUndefined()) {
return U(); //new Result with value "Undefined";
} else {
return F(); //new Result with value "False";
}
}
public static Result and(Result r1, Result r2) {
if(r1.isFalse() || r2.isFalse()){
return F(); //new Result with value "False";
} else if(r1.isUndefined() || r2.isUndefined()) {
return U();//new Result with value "Undefined";
} else {
return V(); //new Result with value "True";
}
}
那行得通,但在很多情况下,它效率不高,因为我需要在计算 "or" 或 "and" 的 return 之前计算两个结果的值:
如果我这样做
if(f1() || f2()){
}
并且f1()的结果为True,f2()永远不会执行以节省计算时间。
是否有解决方案可以使我的自定义行为具有相同的行为 class?
您可以使用 Supplier
来 'delayed' 执行您的 Result
class:
public static Result or(Supplier<Result> r1Supplier, Supplier<Result> r2Supplier) {
Result r1 = r1Supplier.get();
if(r1.isTrue()){
return V(); //new Result with value "True";
} else if(r1.isUndefined()) {
return U(); //new Result with value "Undefined";
} else {
// only here you need to handle r2
Result r2 = r2Supplier.get();
if(r2.isTrue()){
return V(); //new Result with value "True";
} else if(r2.isUndefined()) {
return U(); //new Result with value "Undefined";
} else {
return F();
}
}
}
它可以稍微清理一下并更好地排序,但你掌握了它的窍门
对于 Java 中的项目,我创建了一个自定义布尔值 class(名为 Result),它可以具有三个值:True、False 或 Undefined。 我定义了两个函数:"or" 和 "and",规则是:
public static Result or(Result r1, Result r2) {
if(r1.isTrue() || r2.isTrue()){
return V(); //new Result with value "True";
} else if(r1.isUndefined() || r2.isUndefined()) {
return U(); //new Result with value "Undefined";
} else {
return F(); //new Result with value "False";
}
}
public static Result and(Result r1, Result r2) {
if(r1.isFalse() || r2.isFalse()){
return F(); //new Result with value "False";
} else if(r1.isUndefined() || r2.isUndefined()) {
return U();//new Result with value "Undefined";
} else {
return V(); //new Result with value "True";
}
}
那行得通,但在很多情况下,它效率不高,因为我需要在计算 "or" 或 "and" 的 return 之前计算两个结果的值:
如果我这样做
if(f1() || f2()){
}
并且f1()的结果为True,f2()永远不会执行以节省计算时间。
是否有解决方案可以使我的自定义行为具有相同的行为 class?
您可以使用 Supplier
来 'delayed' 执行您的 Result
class:
public static Result or(Supplier<Result> r1Supplier, Supplier<Result> r2Supplier) {
Result r1 = r1Supplier.get();
if(r1.isTrue()){
return V(); //new Result with value "True";
} else if(r1.isUndefined()) {
return U(); //new Result with value "Undefined";
} else {
// only here you need to handle r2
Result r2 = r2Supplier.get();
if(r2.isTrue()){
return V(); //new Result with value "True";
} else if(r2.isUndefined()) {
return U(); //new Result with value "Undefined";
} else {
return F();
}
}
}
它可以稍微清理一下并更好地排序,但你掌握了它的窍门