如果不为null,则使用Integer对象求和

时间:2014-06-02 15:01:14

标签: java null integer drools

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

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

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

但我不能进入“null”分支。

完整版: 整数奖励值是已解雇的Drools规则的结果。此规则使用insertLogical(new object)语句返回此Integer Bonus。根据流氓手册,

  

insertLogical(new Something ());类似于insert,但对象会   当没有更多事实支持真相时,自动收回   目前的解雇规则。   换句话说,只要该规则的条件不再适用,   引擎撤回逻辑插入的事实。这通常被称为   作为“真相维护”

只要规则有效,Bonus对象就存在且正常总和有效;但是当规则被撤销并且奖金被破坏时,我需要这笔金额继续有效

瘾,我可以说我正在尝试用Drools实现Magic The Gathering纸牌游戏;所以我正在尝试将卡片写成“什么东西,所以某事”。使用insertLogical我猜我只需关心规则的激活而不是它的删除。

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

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

实施例: 我有一张正在使用的牌,其值为3.然后我播放另一张牌,将该值增加到4,但只要第二张牌保持在比赛中。 通常,使用Drools insert语句,我必须编写一些代码,这些代码会增加该卡的值字段(映射到Java类),然后一些代码会在第二张卡不再使用时减少该值。使用insertLogical(如果我理解正确的话)我有免费的减少代码。 问题是inserteLogical仅适用于新的java对象(不存在或最不适用于对象字段);所以我声明一个新的Bonus对象(正或负整数)我可以添加到卡值,但它可以随时销毁,“添加”功能必须仍然有效。

当第二张牌被播放时(或者已经是第一张牌)我必须像这样修改第一张牌值

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

因此,如果存在奖金(第二张卡片),它会自动更改

4 个答案:

答案 0 :(得分:1)

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

/**
 * 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;
}

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

如果规则因手中(或桌面或......)存在卡片(或卡片组合)而插入Integer对象,则需要累积此奖励值在整体奖金计数器中:

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

如何插入“新奖金”并不重要。累积后,可以丢弃。 - 当然,游戏规则可能会另有要求,但这是OP要知道的。

AccumulatedBonus是一个int字段value的简单包装类,这是必需的,因为你无法修改整数并且它们没有“身份”,所以你无法区分它由于卡(组合)而产生的“新”奖金。考虑遵循F.Böller的建议,并为不同的整数使用不同的(!)包装类,这些整数必须相互区分。

答案 3 :(得分:0)

使用Java 8可以是:

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