1.42 用Java安全地将long转换为int | Java Debug 笔记

664 阅读1分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看 活动链接

Debug 笔记 <用Java安全地将long转换为int>

提问

Java中最惯用的方法是验证从转换longint不会丢失任何信息?

这是我当前的实现:

public static int safeLongToInt(long l) {
    int i = (int)l;
    if ((long)i != l) {
        throw new IllegalArgumentException(l + " cannot be cast to int without changing its value.");
    }
    return i;
}

回答一

Java 8已添加了一个新方法来完成此任务。

import static java.lang.Math.toIntExact;

long foo = 10L;
int bar = toIntExact(foo);

ArithmeticException在溢出的情况下抛出异常。

Java 8中已添加了其他几种溢出安全方法,它们的结尾是精确。

例子:

  • Math.incrementExact(long)
  • Math.subtractExact(long, long)
  • Math.decrementExact(long)
  • Math.negateExact(long),
  • Math.subtractExact(int, int)

回答二

我想我会简单地做到这一点:

public static int safeLongToInt(long l) {
    if (l < Integer.MIN_VALUE || l > Integer.MAX_VALUE) {
        throw new IllegalArgumentException
            (l + " cannot be cast to int without changing its value.");
    }
    return (int) l;
}

回答三

使用Google GuavaInts类,您的方法可以更改为:

public static int safeLongToInt(long l) {
    return Ints.checkedCast(l);
}

从链接的文档中:

CheckedCast
public static int checkedCast(long value)
value如果可能,返回等于的int值。
参数: value -int类型范围内的任何值
返回:int等于 的值value
抛出: IllegalArgumentException -如果value大于Integer.MAX_VALUE或小于Integer.MIN_VALUE

顺便说一句,您不需要safeLongToInt包装器,除非您希望将其保留在适当的位置以用于更改功能而无需进行大量重构。

回答四

使用BigDecimal:

long aLong = ...;
int anInt = new BigDecimal(aLong).intValueExact(); // throws ArithmeticException
                                                   // if outside bounds

回答五

我的第一种方法是:

public int longToInt(long theLongOne) {
  return Long.valueOf(theLongOne).intValue();
}

但这仅仅是将long转换为int,有可能创建新Long实例或从Long池中检索它们。

文章翻译自Stack Overflow :stackoverflow.com/questions/1…