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();
            }
        }
    }

它可以稍微清理一下并更好地排序,但你掌握了它的窍门