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

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]

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



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 .


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

        }
}

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

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.


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 ...


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

0

visitantes largos = 1000;

int convVisitors = (int) visitantes;


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

15
Creo que se olvidó de crear una fábrica de algún lugar abstracto
user541686
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.