Конвертировать длинные в целые


308

Как преобразовать Longзначение в Integerзначение в Java?


13
Во-первых, вам нужно проверить, не превышает ли значение Long значение Integer MaxValue.
Лукаш


Ответы:


500
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);

5
Это лучший ответ, потому что он обрабатывает значения 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;

Все три версии генерируют практически идентичный байт-код:

 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]

12
Незначительная стилюстическая проблема: вероятно, вам следует использовать суффикс в верхнем регистре 123Lдля удобства чтения
Джои

Или вы можете использовать хороший шрифт ... и мы снова здесь ...: D (просто j / k, я тоже так делаю)
davidcsb

@ ВячеславДобромыслов правда. вопрос был о длинном, а не нулевом
Шон Патрик Флойд

2
@SeanPatrickFloyd да. Не забывайте, что значение переменной Long иногда может быть равно NULL.
Вячеслав Добромыслов

2
@ user64141 Приведение типов в Java - сложная проблема. Приведение объектов в порядке, потому что вы на самом деле ничего не меняете, просто смотрите на один и тот же объект по-другому. Но в этом случае у вас есть цепочка осмысленных приведений: от объекта к примитиву и затем, через безумие автобокса, к объекту снова, даже если синтаксис предполагает, что это еще один примитив. Для меня это злоупотребление как боксом, так и примитивным преобразованием. Не все, что можно сделать, должно быть сделано.
Шон Патрик Флойд,


20

Если вы хотите проверить наличие переполнений и использовать 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;
}

8

Вам нужно будет набрать приведение.

long i = 100L;
int k = (int) i;

Помните, что long имеет больший диапазон, чем int, поэтому вы можете потерять данные.

Если вы говорите о коробочных типах, то прочитайте документацию .


6

Если вы используете 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);

        }
}

5

Лучший простой способ сделать это:

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;
    }

4

В Java 8 вы можете использовать toIntExact. Если вы хотите обрабатывать nullзначения, используйте:

Integer intVal = longVal == null ? null : Math.toIntExact(longVal);

Хорошая вещь об этом методе - то, что он бросает, ArithmeticExceptionесли аргумент ( long) переполняет int.


3

Предполагая, что не null longVal

Integer intVal = ((Number)longVal).intValue();

Это работает, например, если вы получаете объект, который может быть целым или длинным. Я знаю, что это ужасно, но это случается ...


2

Использование toIntExact (long value) возвращает значение длинного аргумента, вызывая исключение, если значение переполняет int. это будет работать только API уровня 24 или выше.

int id = Math.toIntExact(longId);

0

длинные посетители = 1000;

int convVisitors = (int) посетители;


-2

В Java есть строгий способ конвертировать long в int

не только lnog может конвертировать в int, любой тип расширяет класс Number может конвертировать в другой тип Number в общем, здесь я покажу вам, как конвертировать long в int, другой тип наоборот.

Long l = 1234567L;
int i = org.springframework.util.NumberUtils.convertNumberToTargetClass(l, Integer.class);

15
Я думаю, что вы забыли создать где-то абстрактную фабрику
user541686
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.