Ответы:
Integer i = theLong != null ? theLong.intValue() : null;
или если вам не нужно беспокоиться о нуле:
// auto-unboxing does not go from Long to int directly, so
Integer i = (int) (long) theLong;
И в обеих ситуациях вы можете столкнуться с переполнением (потому что Long может хранить более широкий диапазон, чем Integer).
В Java 8 есть вспомогательный метод, который проверяет переполнение (в этом случае вы получаете исключение):
Integer i = theLong == null ? null : Math.toIntExact(theLong);
intValue
? Плюс он собирается распаковывать в long, приводить к int и rebox to Integer
, что кажется не очень полезным. Я не вижу смысла в голове, у тебя есть на то веские причины?
Long
в long
первый, а затемint
Вот три способа сделать это:
Long l = 123L;
Integer correctButComplicated = Integer.valueOf(l.intValue());
Integer withBoxing = l.intValue();
Integer terrible = (int) (long) l;
Все три версии генерируют практически идентичный байт-код:
0 ldc2_w <Long 123> [17]
3 invokestatic java.lang.Long.valueOf(long) : java.lang.Long [19]
6 astore_1 [l]
// first
7 aload_1 [l]
8 invokevirtual java.lang.Long.intValue() : int [25]
11 invokestatic java.lang.Integer.valueOf(int) : java.lang.Integer [29]
14 astore_2 [correctButComplicated]
// second
15 aload_1 [l]
16 invokevirtual java.lang.Long.intValue() : int [25]
19 invokestatic java.lang.Integer.valueOf(int) : java.lang.Integer [29]
22 astore_3 [withBoxing]
// third
23 aload_1 [l]
// here's the difference:
24 invokevirtual java.lang.Long.longValue() : long [34]
27 l2i
28 invokestatic java.lang.Integer.valueOf(int) : java.lang.Integer [29]
31 astore 4 [terrible]
123L
для удобства чтения
Для ненулевых значений:
Integer intValue = myLong.intValue();
Если вы хотите проверить наличие переполнений и использовать Guava , есть Ints.checkedCast()
:
int theInt = Ints.checkedCast(theLong);
Реализация очень проста и вызывает переполнение IllegalArgumentException :
public static int checkedCast(long value) {
int result = (int) value;
checkArgument(result == value, "Out of range: %s", value);
return result;
}
Вам нужно будет набрать приведение.
long i = 100L;
int k = (int) i;
Помните, что long имеет больший диапазон, чем int, поэтому вы можете потерять данные.
Если вы говорите о коробочных типах, то прочитайте документацию .
Если вы используете Java 8 Сделайте это, как показано ниже
import static java.lang.Math.toIntExact;
public class DateFormatSampleCode {
public static void main(String[] args) {
long longValue = 1223321L;
int longTointValue = toIntExact(longValue);
System.out.println(longTointValue);
}
}
Лучший простой способ сделать это:
public static int safeLongToInt( long longNumber )
{
if ( longNumber < Integer.MIN_VALUE || longNumber > Integer.MAX_VALUE )
{
throw new IllegalArgumentException( longNumber + " cannot be cast to int without changing its value." );
}
return (int) longNumber;
}
В Java 8 вы можете использовать toIntExact
. Если вы хотите обрабатывать null
значения, используйте:
Integer intVal = longVal == null ? null : Math.toIntExact(longVal);
Хорошая вещь об этом методе - то, что он бросает, ArithmeticException
если аргумент ( long
) переполняет int
.
Предполагая, что не null longVal
Integer intVal = ((Number)longVal).intValue();
Это работает, например, если вы получаете объект, который может быть целым или длинным. Я знаю, что это ужасно, но это случается ...
Использование toIntExact (long value) возвращает значение длинного аргумента, вызывая исключение, если значение переполняет int. это будет работать только API уровня 24 или выше.
int id = Math.toIntExact(longId);
В Java есть строгий способ конвертировать long в int
не только lnog может конвертировать в int, любой тип расширяет класс Number может конвертировать в другой тип Number в общем, здесь я покажу вам, как конвертировать long в int, другой тип наоборот.
Long l = 1234567L;
int i = org.springframework.util.NumberUtils.convertNumberToTargetClass(l, Integer.class);