有更简洁的写法吗:
if (myInteger != null && myInteger != 0) { ... }
例如,对于字符串,您可以使用StringUtils.isBlank()
。有更简洁的写法吗:
if (myInteger != null && myInteger != 0) { ... }
例如,对于字符串,您可以使用StringUtils.isBlank()
。使用Java 8:
if (Optional.ofNullable(myInteger).orElse(0) != 0) {
...
}
请注意,Optional
可能会帮助您完全避免 if 条件语句,具体取决于您的使用情况...
Optional
确实打开了我不知道存在的门——特别是如果对象不仅仅是一个原始包装器。 - Mattif (Optional.ofNullable(myInteger).orElse(0) != 0) { ....
- Vladimir Gilevichif (!Optional.ofNullable(myInteger).orElse(0).equals(0)) { ....
- Vladimir Gilevich由于在问题中提到了StringUtils
类,我假设项目已经在使用Apache Commons库。
那么你可以使用以下方法:
if (0 != ObjectUtils.defaultIfNull(myInteger, 0)) { ... }
或者使用静态导入:
if (0 != defaultIfNull(myInteger, 0)) { ... }
public static boolean isNullorZero(Integer i){
return 0 == ( i == null ? 0 : i);
}
我同意这段文字不易读懂 ;)
还有一种空安全的方法可以这样做:
Long val = null;
if( val == Long.valueOf( 0 ) ) {...}
或者
if( Objects.equals( val, 0L ) ) {...}
valueOf(0)
的第一个代码示例仅适用于-127至128之间的值。考虑使用此技术的人不应该假设它在一般情况下都有效。 - ParakletaSystem.out.println(999999999l == Long.valueOf( 999999999 ));
我记得学习过范围在[-128:127]之间的长池,但似乎这不是Java 11的情况。 - ITishaLong val = 999999999l; System.out.println(val == Long.valueOf(999999999));
。这里的区别在于你在注释中给出的示例实际上是将 Long
拆箱为原始的 long
进行比较。 - Parakletaprivate boolean isNullOrZero(Integer i){
return i == null || i.intValue() == 0;
}
对于其他类型:
i.longValue() == 0
对于Long类型
i.doubleValue() == 0
对于Double类型
i.shortValue() == 0
对于Short类型
i.floatValue() == 0
对于Float类型
public class NumberUtils {
private NumberUtils(){
}
public static < T extends Number> T getNumberOrZero(T number, Class<? extends Number> clazz) {
return Optional.ofNullable(number)
.orElse(getZeroValue(clazz));
}
@SuppressWarnings("unchecked")
private static < T extends Number> T getZeroValue( Class<? extends Number> clazz){
try{
Constructor<? extends Number> constructor = clazz.getDeclaredConstructor(String.class);
return (T) constructor.newInstance("0");
}catch (ReflectiveOperationException e) {
throw new IllegalArgumentException("Can't get zero value ", e);
}
}
}
Integer myNumber = NumberUtils.getNumberOrZero(someIntegerThatCanBeNull, Integer.class);
myInteger
的实现(即如果myInteger
中的整数属性是框类型Integer
还是未装箱的原始int
),您可能只需要编写一个条件语句。
Integer
是实际对象,这意味着它们有能力为null
。 话虽如此,它们也可以将0作为值保存。 因此,在这种情况下,您必须进行两个检查。
int
是原始类型,不能保存null
值。 在这种情况下,您只需检查您的int
属性是否不等于0。
ObjectUtils.nullSafeEquals(0, myInteger)
是一个很好的选择,如果你不想增加圈复杂度,同时仍然希望在处理空值时获得 myInteger.equals(0)
的功能。
private boolean isNotNullAndZero(Long num){
return Optional.ofNullable(num).orElse(0L) != 0L ? true:false;
}
? true : false
几乎总是完全多余的。永远不要这样做。之后,你的答案几乎与我的完全相同。 - Florian Albrecht
int
和Integer
(后者可以为空)。 - ThomasInteger
而不是int
。 - Sweeperif (myOptInteger.orElse(0) != 0)
。 - Giulio Franco