Convertir largo en entero

Respuestas:

500
Integer i = theLong != null ? theLong.intValue() : null;

o si no necesita preocuparse por nulo:

// auto-unboxing does not go from Long to int directly, so
Integer i = (int) (long) theLong;

Y en ambas situaciones, puede encontrarse con desbordamientos (porque un Long puede almacenar un rango más amplio que un Integer).

Java 8 tiene un método auxiliar que verifica el desbordamiento (en ese caso, se obtiene una excepción):

Integer i = theLong == null ? null : Math.toIntExact(theLong);
Thilo
fuente
55
Es la mejor respuesta porque maneja valores NULL.
Viacheslav Dobromyslov
3
@ViacheslavDobromyslov la pregunta era sobre valores largos, no sobre valores nulos. Y personalmente creo en rechazar nulo por adelantado en lugar de usar null in -> null out y, por lo tanto, transportar null a través de mi aplicación. Entonces, uno podría argumentar que esta es la peor respuesta :-)
Sean Patrick Floyd
1
¿Por qué lanzarías dos veces si solo puedes llamar intValue? Además, va a unbox a long, cast a int y rebox a Integer, lo que no parece muy útil. No veo el punto en mi cabeza, ¿tienes una buena razón para esto?
Dici
Recibo el error: no se puede invocar intValue () en el tipo primitivo largo
Anand
1
@ Thilo oh, lo entiendo. Básicamente, estás convirtiendo Longa longprimero, y luego aint
mrid
123

Aquí hay tres formas de hacerlo:

Long l = 123L;
Integer correctButComplicated = Integer.valueOf(l.intValue());
Integer withBoxing = l.intValue();
Integer terrible = (int) (long) l;

Las tres versiones generan un código de bytes casi idéntico:

 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]
Sean Patrick Floyd
fuente
12
Problema estilístico menor: probablemente debería usar el sufijo en mayúsculas 123Lpara facilitar la lectura.
Joey
O puede usar una buena fuente ... y aquí vamos de nuevo ...: D (solo j / k, también hago eso)
davidcsb
@ViacheslavDobromyslov cierto. la pregunta era sobre Long, no nulo
Sean Patrick Floyd
2
@SeanPatrickFloyd sí. No olvide que el valor de la variable Long podría ser NULL a veces.
Viacheslav Dobromyslov
2
@ user64141 La conversión de tipos en Java es un problema complicado. Lanzar objetos está bien, porque en realidad no estás cambiando nada, solo estás mirando el mismo objeto de una manera diferente. Pero en este caso, tiene una cadena de lanzamientos significativos, desde Objeto a primitivo y luego, a través de la locura del autoboxing, para objetar nuevamente, aunque la sintaxis sugiere que es otro primitivo. Para mí, este es un mal uso tanto del boxeo como de la conversión primitiva. No todo lo que se puede hacer debe hacerse.
Sean Patrick Floyd
48

Para valores no nulos:

Integer intValue = myLong.intValue();
pajarito
fuente
1
Se ve mucho más limpio que (int) (long) imo.
Gaʀʀʏ
Uso Long.valueOf (LONG_VARIABLE_HERE) .intValue ()
Francis Rodrigues
20

Si le interesa verificar si hay desbordamientos y tiene guayaba a mano, hay Ints.checkedCast():

int theInt = Ints.checkedCast(theLong);

La implementación es muy simple y arroja IllegalArgumentException en caso de desbordamiento:

public static int checkedCast(long value) {
  int result = (int) value;
  checkArgument(result == value, "Out of range: %s", value);
  return result;
}
Jacob Marble
fuente
8

Tendrás que escribir cast it.

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

Tenga en cuenta que un largo tiene un rango mayor que un int, por lo que podría perder datos.

Si está hablando de los tipos encuadrados, lea la documentación .

Jeff Foster
fuente
6

Si está utilizando Java 8, hágalo de la siguiente manera

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

        }
}
Sapra Dushyant
fuente
5

La mejor manera simple de hacerlo es:

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;
    }
Adi
fuente
4

En Java 8 puedes usar toIntExact. Si desea manejar nullvalores, use:

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

Lo bueno de este método es que arroja un ArithmeticExceptionsi el argumento ( long) desborda un int.

Jasper de Vries
fuente
3

Suponiendo que no sea nulo longVal

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

Funciona, por ejemplo, y obtienes un Objeto que puede ser un Entero o un Largo. Sé que es feo, pero sucede ...

Edwin Miguel
fuente
2

El uso de toIntExact (valor largo) devuelve el valor del argumento largo, arrojando una excepción si el valor desborda un int. solo funcionará con el nivel de API 24 o superior.

int id = Math.toIntExact(longId);
Anjal Saneen
fuente
0

visitantes largos = 1000;

int convVisitors = (int) visitantes;

Bala
fuente
-2

En java, hay una forma rigurosa de convertir un largo a int

no solo lnog se puede convertir en int, cualquier tipo de clase se extiende El número se puede convertir a otro tipo de Número en general, aquí le mostraré cómo convertir un largo a int, otro tipo viceversa.

Long l = 1234567L;
int i = org.springframework.util.NumberUtils.convertNumberToTargetClass(l, Integer.class);
tsaowe
fuente
15
Creo que se olvidó de crear una fábrica de algún lugar abstracto
user541686