1. IF函数
IF 函数可用于判断一个条件能否满足;如果满足返回一个值,如果不满足则返回另外一个值。
2. 函数用法
IF(logical_test,value_if_true, value_if_false)
其中各参数的含义如下:
- logical_test:必需,逻辑表达式,要判断是否成立的条件;
- value_if_true:必需,满足条件时的返回值;
- value_if_false:必需,不满足条件时的返回值。
3. 函数示例
IF(A,B1,B2),表示如果满足条件 A,那么返回 B1,否则返回 B2。
如,成绩判定时,规定 60 分以下,为不及格;60 分以上,为及格。则设置公式为
IF(成绩<60,"不及格","及格")
4. 代码实战
首先我们在function包下创建logic包,在logic包下创建IfFunction类,代码如下:
package com.ql.util.express.self.combat.function.logic;
import com.ql.util.express.ArraySwap;
import com.ql.util.express.InstructionSetContext;
import com.ql.util.express.OperateData;
import com.ql.util.express.instruction.op.OperatorBase;
import com.ql.util.express.self.combat.exception.FormulaException;
/**
* 类描述: IF公式函数
*
* @author admin
* @version 1.0.0
* @date 2023/11/21 16:18
*/
public class IfFunction extends OperatorBase {
public IfFunction(String name) {
this.name = name;
}
@Override
public OperateData executeInner(InstructionSetContext parent, ArraySwap list) throws Exception {
if(list.length < 2) {
throw new FormulaException("\"" + this.aliasName + "\"操作至少要两个操作数");
} else {
Object obj = list.get(0).getObject(parent);
String msg;
if(obj == null) {
msg = "\"" + this.aliasName + "\"的判断条件不能为空";
throw new FormulaException(msg);
} else if(!(obj instanceof Boolean)) {
msg = "\"" + this.aliasName + "\"的判断条件 必须是 Boolean,不能是:";
throw new FormulaException(msg + obj.getClass().getName());
} else {
return ((Boolean)obj).booleanValue()?list.get(1):(list.length == 3?list.get(2):null);
}
}
}
}
把IfFunction类注册到公式函数入口类中,代码如下:
package com.ql.util.express.self.combat.ext;
import com.ql.util.express.ExpressRunner;
import com.ql.util.express.IExpressResourceLoader;
import com.ql.util.express.parse.NodeTypeManager;
import com.ql.util.express.self.combat.function.logic.AndFunction;
import com.ql.util.express.self.combat.function.logic.IfFunction;
/**
* 类描述: 仿简道云公式函数实战入口类
*
* @author admin
* @version 1.0.0
* @date 2023/11/21 15:29
*/
public class FormulaRunner extends ExpressRunner {
public FormulaRunner() {
super();
}
public FormulaRunner(boolean isPrecise, boolean isTrace) {
super(isPrecise,isTrace);
}
public FormulaRunner(boolean isPrecise, boolean isStrace, NodeTypeManager nodeTypeManager) {
super(isPrecise,isStrace,nodeTypeManager);
}
public FormulaRunner(boolean isPrecise, boolean isTrace, IExpressResourceLoader iExpressResourceLoader, NodeTypeManager nodeTypeManager) {
super(isPrecise,isTrace,iExpressResourceLoader,nodeTypeManager);
}
@Override
public void addSystemFunctions() {
// ExpressRunner 的内部系统函数
super.addSystemFunctions();
// 扩展公式函数
this.customFunction();
}
/***
* 自定义公式函数
*/
public void customFunction() {
// AND函数
this.addFunction("AND",new AndFunction("AND"));
// IF函数
this.addFunction("IF",new IfFunction("IF"));
}
}
创建测试用例:
package com.ql.util.express.self.combat;
import com.ql.util.express.DefaultContext;
import com.ql.util.express.self.combat.ext.FormulaRunner;
import org.junit.Test;
/**
* 类描述: 实战测试类
*
* @author admin
* @version 1.0.0
* @date 2023/11/21 15:45
*/
public class CombatTest {
@Test
public void IF() throws Exception{
FormulaRunner formulaRunner = new FormulaRunner(true,true);
// 创建上下文
DefaultContext<String, Object> context = new DefaultContext<>();
String express = "IF(成绩<60,\"不及格\",\"及格\")";
context.put("成绩",79);
Object object = formulaRunner.execute(express, context, null, true, true);
System.out.println(object);
}
}
运行结果