1. Обзор
В этом руководстве мы увидим, как мы можем преобразовать значение long
в тип int
в Java. Прежде чем мы начнем программировать, нам нужно указать некоторые подробности об этом типе данных.
Во-первых, в Java длинные
значения представлены 64-битными числами со знаком. С другой стороны, значения int
представлены 32-битными числами со знаком. Поэтому преобразование более высокого типа данных в более низкий называется сужением приведения типов . В результате этих преобразований некоторые биты будут потеряны, если значения long
превышают Integer.MAX_VALUE
и Integer.MIN_VALUE
.
Кроме того, для каждого варианта преобразования мы покажем, как это работает для длинного
значения, равного Integer.MAX_VALUE
плюс один.
2. Преобразование данных
2.1. Приведение значений
Во-первых, приведение значений в Java является наиболее распространенным способом преобразования типов — это просто:
public int longToIntCast(long number) {
return (int) number;
}
2.2. Ява 8
Начиная с Java 8, мы можем использовать еще два способа преобразования типов: с помощью пакета Math
или с помощью лямбда-функции. Для пакета 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. Использование гуавы
Далее мы покажем преобразование типов с помощью класса Google Guava Ints :
public int longToIntGuava(long number) {
return Ints.checkedCast(number);
}
Кроме того, класс Google Guava Ints
предоставляет метод насыщенного преобразования:
public int longToIntGuavaSaturated(long number) {
return Ints.saturatedCast(number);
}
2.6. Целочисленные верхние и нижние границы
Наконец, нам нужно учитывать, что целочисленное значение имеет верхнюю и нижнюю границы. Эти ограничения определяются Integer.MAX_VALUE
и Integer.MIN_VALUE
. Для значений, выходящих за эти пределы, результаты отличаются от одного метода к другому.
В следующем фрагменте кода мы проверим случай, когда значение int не может содержать длинное значение:
@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));
}
Использование прямого приведения, лямбда-выражения или использования значений бокса дает отрицательное значение. В этих случаях длинное значение больше, чем Integer.MAX_VALUE
, поэтому результирующее значение заключено в отрицательное число. Если длинное значение меньше 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, метод satCast
, сначала проверяет целочисленные пределы и возвращает предельное значение, если переданное число больше или меньше, чем целочисленная верхняя и нижняя границы:
@Test
public void longToIntGuavaSaturated() {
long max = Integer.MAX_VALUE + 10L;
int expected = 2147483647;
assertEquals(expected, ConvertLongToInt.longToIntGuavaSaturated(max));
}
3. Заключение
В этой статье мы рассмотрели несколько примеров преобразования long в тип int в Java. Использование нативного приведения Java и некоторых библиотек.
Как обычно, все фрагменты, использованные в этой статье, доступны на GitHub .