在Java中将整数(可能为null)转换为int的更好方法?

16

Integer 可以为 null。我通过以下方式将 Integer 转换为 int

Integer integer = null;
int i;

try {
    i = integer.intValue();
}
catch (NullPointerException e) {
    i = -1;
} 

有更好的方法吗?


使用assert来确保它不是null。 - We are Borg
2
在这种情况下,您不应该使用assert,因为null是一条有效的执行路径,并且确实可能在生产中发生。 - S. Pauk
5个回答

25

使用Java8,以下代码也可以正常工作:

Optional.ofNullable(integer).orElse(-1)

这是现代Java的正确答案,因为它可以在一个赋值语句中完成。三元表达式则不行。 - Kong

20

避免异常总是更好。

int i = integer != null ? integer.intValue() : -1;

3
可恶,你的手指真够快的。我本来想用自动装箱的方法写成int i = integer == null ? 0 : integer; - Kayaman
1
避免使用C语言的传统符号表示法也被一些人认为是更好的方式。 - S. Pauk
@kocko 在你编辑之前,我的原始答案(没有使用.intValue())就可以正常工作(Java会自动拆箱)。你认为显式调用intValue更有效吗? - Eran
4
@kocko的.intValue()并不是避免自动拆箱;它是明确地进行了拆箱。 - khelwood
1
@khelwood,我不同意。如果您查看Integer#intValue()的源代码,您会发现该方法返回嵌套的private final int value;。因此,将integer.intValue()分配给int不会触发编译器的任何装箱/拆箱功能。但是,使用int i = integer;实际上将强制编译器将Integer拆箱为int。这就是为什么我认为显式调用.intValue()更高效(即使没有太大的性能差异)和可读性更好的原因。 - Konstantin Yovkov
显示剩余2条评论

4

Java 9 引入了 Objects.requireNonNullElse,在不使用外部库的情况下,Java Vanilla 提供了替代方法:

Integer integerValue = null;
int intValue = Objects.requireNonNullElse(integerValue, 0);

比起使用 Optional,我认为这是更好的方法。 - xwinus
什么原因?我想学习。 - Jens.Huehn_at_SlideFab.com

2

如果您的类路径中已经有guava,那么我喜欢michaelgulak提供的答案。

Integer integer = null;
int i = MoreObjects.firstNonNull(integer, -1);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接