我使用的代码如下:
Double getabsValue(final Object[] value){
if (value==null) return null;
if (value.lengt==0) return null;
final Double absValue=Maths.abs(value[0]);
if (absValue>0) return absValue
else return null;
但在我的应用程序中,我遇到性能问题。 如何优化?
也许更好用?
if (absValue>0) return absValue
else return absValue<0?-absValue:null;
由于
答案 0 :(得分:7)
嗯,你目前得到的代码甚至都不会编译 - 据我所知,没有Math.abs(Object)
调用。但是,假设你实际上在那里有Double
,那么你将会一直拳击。当值 0时,您可以避免装箱,当值 0时,可以避免调用,如下所示:
static Double getAbsValue(Object[] values) {
if (values == null || values.length == 0) {
return null;
}
Double value = (Double) values[0];
return value > 0 ? value
: value == 0 ? null
: -value;
}
当我们到达最终选项时,我们已经知道该值为负数,因此我们不再需要调用abs
。
这里的背景并不十分清楚。你说你遇到了性能问题,但在这段代码中肯定是吗?
编辑:您的最新代码显示:
if (absValue>0) return absValue
else return -1*absValue;
这不会做同样的事情 - 如果数组包含一个盒装0值,它就不会返回null,就像原始代码一样。
您应该在演出前关注正确性。
您希望代码在输入0时做什么?如果你想让它返回0,那么我会使用:
return value >= 0 ? value : -value;
如果您希望它返回null,请使用我最初提供的代码。
为什么包括乘法-1而不是仅使用一元否定运算符?顺便说一下?我希望编译器或JIT无论如何都要摆脱它,但从根本上说你不希望执行乘法 - 你想要执行否定。让您的代码尽可能地与您描述目标的方式一致阅读。
答案 1 :(得分:3)
我使用的代码如下:
Double getabsValue(final Object[] value){
为什么?
我要做的第一件事就是重新定义签名。
Object[]
基本上必须是Double[]
或至少{em}包含双倍的Object[]
时,指定Double
是没有意义的,否则会抛出一个ClassCastException。double
当你真正需要的是double
?所以我会重新定义它以采用return Math.abs(d);
类型的单个参数。这将把数据从数组中取出的开销转移回调用者,在那里他可以看到它。他甚至可能没有拥有数组,所以他必须构造它来调用这个方法。并且他可能已经有一个double而不是Double,在这种情况下,他或者编译器必须将它装入Double。
我要做的第二件事是回顾这次改变后剩下的东西。这个变化摆脱了空值和长度检查以及类型转换,所以剩下的就是{{1}}所以很明显整个方法基本没有意义。
所以我要做的第三件事是删除它。