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 值,并将其转换为浮点值 &lt;valueType&gt; 元素值...

不,我确实将value="0" 也转换为浮点数。

现在,我必须应用已指定为condition="&gt;" 的条件。

我不想在 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 &lt; 0")); System.out.println(new bsh.Interpreter().eval("1 &gt; 0")); System.out.println(new bsh.Interpreter().eval("1 &gt;= 0")); System.out.println(new bsh.Interpreter().eval("0 &gt;= 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 能够使用字符串“ &lt; 测试应转换为a.compareTo(b) &lt; 0。字符串compareTo 将执行字典测试,而数字包装器将执行您期望的操作;但是,您可以将它们全部视为 Comparable 实例。 还请注意,所有 、>=、==、!= 运算符都可以用一个结果表表示,compareTo() 为 =(例如,true, true, false 和 != 为 true, false, true 我没有意识到这如何解决每个操作员的 IF-ELSE-ELSEIF 跳数过多的操作问题。 对不起,我想我误解了你的问题。您从 XML 中读取了字符串“eval() 过程的语言中,您也应该避免这种情况。

以上是关于Java - 与原始数据类型的动态比较的主要内容,如果未能解决你的问题,请参考以下文章

java ==与equals()方法的总结

integer定义的值可以赋给int定义的值吗?

java 中的原始类型与原始封装类型

2021-06-17 java----随记

2021-06-17 java----随记

第五周特种JAVA健民欧巴分享经验