【问题标题】:A better way to convert Integer (may be null) to int in Java?在 Java 中将 Integer(可能为 null)转换为 int 的更好方法?
【发布时间】:2016-01-21 12:44:55
【问题描述】:

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

Integer integer = null;
int i;

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

有没有更好的办法?

【问题讨论】:

  • 使用 assert 确保它不为空。
  • 你不应该在这种情况下使用 assert 因为 null 是一个有效的执行路径,并且确实可能​​在生产中发生

标签: java integer int converter


【解决方案1】:

在 Java8 中也可以使用:

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

【讨论】:

  • 这是现代 Java 的正确答案,因为它可以在一个作业中完成。三元表达式不行。
【解决方案2】:
【解决方案3】:

如果你的类路径中已经有guava,那么我喜欢answer provided by michaelgulak

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

【讨论】:

    【解决方案4】:

    避免异常总是更好的。

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

    【讨论】:

    • 该死的你和你快速的手指。我打算采用int i = integer == null ? 0 : integer; 的自动装箱方式。
    • 避免 C 遗留符号也可能被某些人认为是更好的方法
    • @kocko 我的原始答案(在您编辑之前)没有.intValue() 工作正常(Java 处理自动拆箱)。你认为显式调用intValue 更有效率吗?
    • @kocko .intValue() 并没有避免拆箱;这是明确拆箱
    • @khelwood,我不同意。如果您查看Integer#intValue() 的来源,您可以看到该方法返回嵌套的private final int value;。因此,将integer.intValue() 分配给int 不会触发编译器的任何装箱/拆箱功能。但是,拥有int i = integer; 实际上会强制编译器从Integerint 进行拆箱。这就是为什么我发现对.intValue() 的显式调用更高效(即使性能差异不大)和可读
    猜你喜欢
    • 2020-06-14
    • 2020-07-06
    • 2010-10-27
    • 2011-10-01
    • 1970-01-01
    • 2021-08-20
    • 2013-10-07
    相关资源
    最近更新 更多