Перейти к основному содержимому

Преобразование long в тип int в Java

· 3 мин. чтения

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 .