Это лучший ответ, потому что он обрабатывает значения NULL.
Вячеслав Добромыслов
3
@ViacheslavDobromyslov вопрос был о длинных значениях, а не о нулевых значениях. И лично я верю, что нужно сначала отклонить null, а не использовать null in -> null out и, таким образом, передать null через мое приложение. Таким образом, можно также утверждать, что это худший ответ :-)
Шон Патрик Флойд
1
Зачем вам разыгрывать дважды, когда вы можете просто коллировать intValue? Плюс он собирается распаковывать в long, приводить к int и rebox to Integer, что кажется не очень полезным. Я не вижу смысла в голове, у тебя есть на то веские причины?
Дичи
Я получаю сообщение об ошибке: не удается вызвать intValue () для примитивного типа long
Ананд
1
@ Вот так, я понял. В основном вы конвертируете Longв longпервый, а затемint
mrid
123
Вот три способа сделать это:
Long l =123L;Integer correctButComplicated =Integer.valueOf(l.intValue());Integer withBoxing = l.intValue();Integer terrible =(int)(long) l;
Все три версии генерируют практически идентичный байт-код:
Незначительная стилюстическая проблема: вероятно, вам следует использовать суффикс в верхнем регистре 123Lдля удобства чтения
Джои
Или вы можете использовать хороший шрифт ... и мы снова здесь ...: D (просто j / k, я тоже так делаю)
davidcsb
@ ВячеславДобромыслов правда. вопрос был о длинном, а не нулевом
Шон Патрик Флойд
2
@SeanPatrickFloyd да. Не забывайте, что значение переменной Long иногда может быть равно NULL.
Вячеслав Добромыслов
2
@ user64141 Приведение типов в Java - сложная проблема. Приведение объектов в порядке, потому что вы на самом деле ничего не меняете, просто смотрите на один и тот же объект по-другому. Но в этом случае у вас есть цепочка осмысленных приведений: от объекта к примитиву и затем, через безумие автобокса, к объекту снова, даже если синтаксис предполагает, что это еще один примитив. Для меня это злоупотребление как боксом, так и примитивным преобразованием. Не все, что можно сделать, должно быть сделано.
publicstaticint safeLongToInt(long longNumber ){if( longNumber <Integer.MIN_VALUE || longNumber >Integer.MAX_VALUE ){thrownewIllegalArgumentException( longNumber +" cannot be cast to int without changing its value.");}return(int) longNumber;}
Использование toIntExact (long value) возвращает значение длинного аргумента, вызывая исключение, если значение переполняет int. это будет работать только API уровня 24 или выше.
В Java есть строгий способ конвертировать long в int
не только lnog может конвертировать в int, любой тип расширяет класс Number может конвертировать в другой тип Number в общем, здесь я покажу вам, как конвертировать long в int, другой тип наоборот.
Long l =1234567L;int i = org.springframework.util.NumberUtils.convertNumberToTargetClass(l,Integer.class);
Ответы:
или если вам не нужно беспокоиться о нуле:
И в обеих ситуациях вы можете столкнуться с переполнением (потому что Long может хранить более широкий диапазон, чем Integer).
В Java 8 есть вспомогательный метод, который проверяет переполнение (в этом случае вы получаете исключение):
источник
intValue
? Плюс он собирается распаковывать в long, приводить к int и rebox toInteger
, что кажется не очень полезным. Я не вижу смысла в голове, у тебя есть на то веские причины?Long
вlong
первый, а затемint
Вот три способа сделать это:
Все три версии генерируют практически идентичный байт-код:
источник
123L
для удобства чтенияДля ненулевых значений:
источник
Если вы хотите проверить наличие переполнений и использовать Guava , есть
Ints.checkedCast()
:Реализация очень проста и вызывает переполнение IllegalArgumentException :
источник
Вам нужно будет набрать приведение.
Помните, что long имеет больший диапазон, чем int, поэтому вы можете потерять данные.
Если вы говорите о коробочных типах, то прочитайте документацию .
источник
Если вы используете Java 8 Сделайте это, как показано ниже
источник
Лучший простой способ сделать это:
источник
В Java 8 вы можете использовать
toIntExact
. Если вы хотите обрабатыватьnull
значения, используйте:Хорошая вещь об этом методе - то, что он бросает,
ArithmeticException
если аргумент (long
) переполняетint
.источник
Предполагая, что не null longVal
Это работает, например, если вы получаете объект, который может быть целым или длинным. Я знаю, что это ужасно, но это случается ...
источник
Использование toIntExact (long value) возвращает значение длинного аргумента, вызывая исключение, если значение переполняет int. это будет работать только API уровня 24 или выше.
источник
длинные посетители = 1000;
int convVisitors = (int) посетители;
источник
В Java есть строгий способ конвертировать long в int
не только lnog может конвертировать в int, любой тип расширяет класс Number может конвертировать в другой тип Number в общем, здесь я покажу вам, как конвертировать long в int, другой тип наоборот.
источник