【问题标题】:Sum with Integer object if not null如果不为空,则与整数对象求和
【发布时间】:2014-06-02 15:01:13
【问题描述】:

我不知道在 Java 中是否可行,但我需要一种方法来执行特殊的“添加功能”。 让我解释一下,

简短版: 是否可以使用 Integer 对象添加 int ?我需要一种方法来检查该整数对象是否存在,如果对象为空,则添加 0,否则添加正确的值 我试过了

public static Integer isNull(Integer bonus){
    if (bonus == null)
        return Integer.valueOf(0);
    else
        return bonus;
}

但我无法进入“空”分支。

完整版: Integer Bonus 值是触发 Drools 规则的结果。此规则使用 insertLogical(new object) 语句返回此整数奖励。根据口水手册,

插入逻辑(新的东西());类似于插入,但对象将 当没有更多事实支持真相时自动撤回 当前触发规则。 换句话说,只要该规则的条件不再为真, 引擎收回逻辑插入的事实。这通常被称为 作为“真相维护”

所以只要规则有效,Bonus 对象就存在并且正常总和有效;但是当规则被撤回并且奖金被销毁时,我需要这笔款项继续有效

上瘾了,我可以说我正在尝试使用 Drools 实现 Magic The Gathering 纸牌游戏;所以我正在尝试对卡片进行编码,例如“当某事,所以某事”。使用 insertLogical 我猜我只需要关心规则的激活而不是删除它。

我希望我的问题很清楚,对不起我的英语不好

更好的解释(也许): 不是那么简单,卡有一个整数值,有时,根据触发的规则不同,这个值可能会改变。我不想手动更改该值,因为该值可以通过多种方式更改,因此我需要 insertLogical() 至少在规则不再存在时不再关心更改这些值.

示例: 我有一张价值为 3 的牌在场。然后我打出另一张牌,将其值增加到 4,但前提是第二张牌仍在场上。 通常,使用 Drools 插入语句,我必须编写一些代码来增加该卡的值字段(映射到 Java 类),然后在第二张卡不再播放时减少该值的一些代码。使用 insertLogical(如果我理解正确的话)我有免费的减少代码。 问题是 inserteLogical 仅适用于新的 java 对象(不是现有的对象,或者最不适用于对象字段);所以我声明了一个新的 Bonus 对象(一个正整数或负整数)我可以添加到卡值中,但它可以随时销毁,并且“添加”函数必须仍然有效。

当第二张牌打出时(或者已经打出第一张牌)我必须像这样修改第一张牌的值

card.value=card.value + isNull(bonus)

因此它可以自动更改是否存在奖金(第二张卡)

【问题讨论】:

  • 不能进入空分支是什么意思?为我工作,除非我误解了你
  • 你可以举一些你想要发生的事情的例子,比如:assertEquals(0, isNull(null));assertEquals(10, isNull(10));
  • aryanaq 的答案:我无法进入从 Main 调用此静态方法的空分支,在 args[1] 中传递整数值
  • 增加混乱?如果这是static void main 的(不是Main 的)参数,则不能在args[x] 中传递整数。 - 还有:什么“总和 [需要] 继续有效?”我认为我知道您要做什么,但更清晰的规范会有所帮助。
  • Uhhhhh,是的,很多混乱,我通过像这样解析将一个整数传递到 'args[0]' Integer.parseInt(args[0]) AND现在比以前清晰了吗?

标签: java null integer drools


【解决方案1】:

使用 java 8 可以:

public int zeroIfNull(Integer bonus) {
    return Optional.ofNullable(bonus).orElse(0);
}

【讨论】:

    【解决方案2】:

    如果我正确理解了你想要什么,这里有一个你可以做什么的例子

    /**
     * Take first value of a String [] as an Integer, and return null if not Ok
     * @param args a String[] that could come from main
     * @return integer value of args[0] or null
     */
    private static Integer getArgs0(String[] args) {
        Integer bonus = null;
        if (args.length > 0) { // special case no args
            try {
                bonus = Integer.parseInt(args[0]);
            }
            catch(NumberFormatException e) {}
        }
        return bonus;
    }
    
    /**
     * Convert a null Integer to 0 - else leave it untouched
     * @param bonus input Integer
     * @return 0 if bonus is null else bonus
     */
    private static int zeroIfNull(Integer bonus) {
        return (bonus == null) ? 0 : bonus;
    }
    

    【讨论】:

    • IDE 说:不兼容的条件操作数类型 int 和 integer
    • @Fjordo 错误在哪一行?我用 Java 7 和 Netbeans 尝试过,甚至没有警告...
    【解决方案3】:

    我使用以下以 null 安全的方式对两个双精度数求和。如果有更好的方法可以做到这一点,我欢迎。

    Double sum(Double num1, Double num2){
            if(Objects.isNull(num1) && Objects.isNull(num2)){
                return null;
            }
            return Double.sum(Optional.ofNullable(num1).orElse(0D),Optional.ofNullable(num2).orElse(0D));
        }
    

    【讨论】:

      【解决方案4】:

      我认为最好为 Integer 定义一个包装类。如果我理解正确,整数代表卡的价值。然后像这样定义一个类 Card:

      public class Card {
        private int value;
        private boolean active;
      }
      

      现在你可以创建一个 List 并实现一个求和的方法。

      【讨论】:

      • 我不确定,但我添加了一个对解决问题很有用的示例
      【解决方案5】:

      如果规则由于一手牌(或桌上或...)中存在牌(或牌的组合)而插入Integer对象,并且该奖金值需要累积在一个总奖金计数器:

      rule "add to bonus"
      when
          $newBonus: Integer()
          $accumulated: AccumulatedBonus()
      then
          modify( $accumulated ){ setValue( $accumulated.getValue() + $newBonus() ) }
          retract( $newBonus );
      end
      

      如何插入“新奖金”并不重要。一旦积累,它可以被丢弃。 - 当然,游戏规则可能有其他要求,但那是 OP 知道的。

      AccumulatedBonus 是一个用于 int 字段 value 的简单包装类,它是必需的,因为您无法修改 Integer,并且它们没有“身份”,因此您无法将其与“新”区分开来由于一张卡(组合)的奖金。考虑遵循 F. Böller 的建议,并为必须相互区分的不同整数使用不同的 (!) 包装类。

      【讨论】:

      • 我不知道怎么回答你,我没有正确理解drools代码,我很新手,最重要的是我不清楚如何用英语解释这个问题.添加整数对象不是规则效果,但它必须修改代表已打牌的现有 java 值。然后,当规则以某种方式撤回时,我不想将值更改回他的默认值,但我希望值自动更改。不知道有没有可能。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多