1. 概述

在这个教程中,我们将探讨如何在Java中将long值转换为int类型。在开始编程之前,我们需要了解一些关于这些数据类型的基本知识。

首先,Java中的long值表示的是64位有符号数。相比之下,int值使用的是32位有符号数。因此,将一个更高的数据类型转换为更低的数据类型被称为窄化类型转换。当long值大于Integer.MAX_VALUEInteger.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 GuavaInts类进行类型转换:

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_VALUEInteger.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上找到。