1. 概述
在这个教程中,我们将探讨如何在Java中将long
值转换为int
类型。在开始编程之前,我们需要了解一些关于这些数据类型的基本知识。
首先,Java中的long
值表示的是64位有符号数。相比之下,int
值使用的是32位有符号数。因此,将一个更高的数据类型转换为更低的数据类型被称为窄化类型转换。当long
值大于Integer.MAX_VALUE
和Integer.MIN_VALUE
时,这种转换会导致部分位被丢弃。
此外,我们将展示每种转换方式在long
值等于Integer.MAX_VALUE
加1时的行为。
2. 数据转换
2.1. 类型转换
首先,在Java中,类型转换通常是最常见的方法——它非常直接:
public int longToIntCast(long number) {
return (int) number;
}
2.2. Java 8
自Java 8以来,我们还有其他两种进行类型转换的方法:使用Math
包或使用lambda函数。对于Math
包,我们可以使用toIntExact
方法:
public int longToIntJavaWithMath(long number) {
return Math.toIntExact(number);
}
2.3. 包装类
另一方面,我们可以使用Long
包装类获取int
值:
public int longToIntBoxingValues(long number) {
return Long.valueOf(number).intValue();
}
2.4. 使用BigDecimal
此外,我们还可以使用BigDecimal
类来完成这种转换:
public static int longToIntWithBigDecimal(long number) {
return new BigDecimal(number).intValueExact();
}
2.5. 使用Guava
接下来,我们将展示使用Google Guava的Ints
类进行类型转换:
public int longToIntGuava(long number) {
return Ints.checkedCast(number);
}
此外,Guava的Ints
类提供了saturatedCast
方法:
public int longToIntGuavaSaturated(long number) {
return Ints.saturatedCast(number);
}
2.6. 整数上下限
最后,我们需要考虑整数有一个上限和下限。这些限制由Integer.MAX_VALUE
和Integer.MIN_VALUE
定义。对于超出这些范围的值,不同方法的结果会有所不同。
在下面的代码片段中,我们将测试当int
值无法容纳long
值的情况:
@Test
public void longToIntSafeCast() {
long max = Integer.MAX_VALUE + 10L;
int expected = -2147483639;
assertEquals(expected, longToIntCast(max));
assertEquals(expected, longToIntJavaWithLambda(max));
assertEquals(expected, longToIntBoxingValues(max));
}
直接转换、使用lambda或包装值会产生负值。在这种情况下,long
值大于Integer.MAX_VALUE
,所以结果值被负数包裹。如果long
值小于Integer.MIN_VALUE
,结果值将是正数。
另一方面,本文描述的三种方法中,有三种可能会抛出不同类型的异常:
@Test
public void longToIntIntegerException() {
long max = Integer.MAX_VALUE + 10L;
assertThrows(ArithmeticException.class, () -> ConvertLongToInt.longToIntWithBigDecimal(max));
assertThrows(ArithmeticException.class, () -> ConvertLongToInt.longToIntJavaWithMath(max));
assertThrows(IllegalArgumentException.class, () -> ConvertLongToInt.longToIntGuava(max));
}
对于前两者,会抛出ArithmeticException
。对于后者,会抛出IllegalArgumentException
。在这种情况下,Ints.checkedCast
会检查整数是否超出范围。
最后,从Guava的saturatedCast
方法来看,它首先检查整数的边界,如果传递的数字大于或小于整数的上下限,它会返回边界值:
@Test
public void longToIntGuavaSaturated() {
long max = Integer.MAX_VALUE + 10L;
int expected = 2147483647;
assertEquals(expected, ConvertLongToInt.longToIntGuavaSaturated(max));
}
3. 总结
在这篇文章中,我们详细讨论了在Java中将long
转换为int
类型的各种示例,包括使用Java原生转换和一些库。如往常一样,本文中所有使用的代码片段可以在GitHub上找到。