Java - 与原始数据类型的动态比较
Posted
技术标签:
【中文标题】Java - 与原始数据类型的动态比较【英文标题】:Java - Dynamic Comparison with Primitive Data Types 【发布时间】:2012-04-29 18:59:38 【问题描述】:朋友们,
我们正在编写一个验证框架...
我们确实有如下配置文件...
<root>
<property name="Premium">
<xmlTag>//Message/Request/Product/Benefit/Premium/amount</xmlTag>
<valueType>float</valueType>
<validation condition=">" value="0">Premium Amount cannot be less than Zero.</validation>
</property>
我使用 XPath 获取 XML 值,并将其转换为浮点值 <valueType>
元素值...
不,我确实将value="0"
也转换为浮点数。
现在,我必须应用已指定为condition=">"
的条件。
我不想在 IF ELSEIF....ELSE 循环中执行此操作。
有没有其他方法可以将“< 或在字符串上使用比较运算符?
这样,我的代码会简单,对未来更多的运营商有用。
================================================ ===============================
感谢大家的建议和回答...
我决定使用BeanShell的bsh.Interpreter。它为我工作......
为大家提供示例代码...
System.out.println(new bsh.Interpreter().eval("1 < 0"));
System.out.println(new bsh.Interpreter().eval("1 > 0"));
System.out.println(new bsh.Interpreter().eval("1 >= 0"));
System.out.println(new bsh.Interpreter().eval("0 >= 0"));
System.out.println(new bsh.Interpreter().eval("1 != 0"));
System.out.println(new bsh.Interpreter().eval("0 != 0"));
System.out.println(new bsh.Interpreter().eval("1 == 0"));
System.out.println(new bsh.Interpreter().eval("0 == 0"));
返回真/假。
谢谢,祝你好运...
【问题讨论】:
你不必使用if-then-else
链,你可以使用哈希映射。但是没有捷径可以动态完成,因此您需要进行大量编码。
你也需要'
看看这个问题:***.com/questions/1432245/… 还有这个问题:***.com/questions/3832323/…
是的,我想涵盖所有可能的比较,例如 、>=、==、!=...等
感谢大家的快速回复和许多可能的方法......感谢 Angelo 提出好的框架...... System.out.println(new bsh.Interpreter().eval("1 < 0")); System.out.println(new bsh.Interpreter().eval("1 > 0")); System.out.println(new bsh.Interpreter().eval("1 >= 0")); System.out.println(new bsh.Interpreter().eval("0 >= 0")); System.out.println(new bsh.Interpreter().eval("1 != 0")); System.out.println(new bsh.Interpreter().eval("0 == 0"));
BeanShell's bsh.Interpreter 做了魔法
【参考方案1】:
你可以使用 switch 语句
char operator = ...;
switch(operator)
case '<': return value1 < value2;
case '=': return value1 == value2;
【讨论】:
你在上一个case
错误地引入了一个作业;请改用==
。【参考方案2】:
我建议使用诸如 Java EL 甚至更好的 Apache Commons Jexl 之类的表达式语言,因为它更容易集成。这是取自JEXL website的代码示例:
// Assuming we have a JexlEngine instance initialized in our class named 'jexl':
// Create an expression object for our calculation
String calculateTax = "((G1 + G2 + G3) * 0.1) + G4";
Expression e = jexl.createExpression( calculateTax );
// populate the context
JexlContext context = new MapContext();
context.set("G1", businessObject.getTotalSales());
context.set("G2", taxManager.getTaxCredit(businessObject.getYear()));
context.set("G3", businessObject.getIntercompanyPayments());
context.set("G4", -taxManager.getAllowances());
// ...
// work it out
Float result = (Float)e.evaluate(context);
在您的特定示例中,您可以将验证 XML 更改为:
<property name="Premium">
<xmlTag>//Message/Request/Product/Benefit/Premium/amount</xmlTag>
<valueType>float</valueType>
<validation expression="Premium> 0">Premium Amount cannot be less than Zero.</validation>
</property>
然后建立自己的 JEXL 上下文:
JexlContext context = new MapContext();
context.set("PREMIUM", <Premium value fetched from XML>);
在我看来,这是最具可扩展性的解决方案,因为它允许您在一行代码中构建复杂的验证表达式。
【讨论】:
【参考方案3】:将原始值包装到相应的包装器中:
Float f = new Float(floatValue)
然后你可以多态地使用提供的compareTo()
方法。
编辑: 您还可以查看表达式解析的全功能实现;除了这里已经提到的其他人,我会添加Spring EL。
【讨论】:
这如何让 OP 能够使用字符串“<
测试应转换为a.compareTo(b) < 0
。字符串compareTo
将执行字典测试,而数字包装器将执行您期望的操作;但是,您可以将它们全部视为 Comparable
实例。
还请注意,所有 、>=、==、!= 运算符都可以用一个结果表表示,compareTo()
为 =(例如,true, true, false 和 != 为 true, false, true
)
我没有意识到这如何解决每个操作员的 IF-ELSE-ELSEIF 跳数过多的操作问题。
对不起,我想我误解了你的问题。您从 XML 中读取了字符串“eval() 过程的语言中,您也应该避免这种情况。以上是关于Java - 与原始数据类型的动态比较的主要内容,如果未能解决你的问题,请参考以下文章