我不知道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)
因此,如果存在奖金(第二张卡片),它会自动更改
答案 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);
}