@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:
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.
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;}
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.
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);
Respuestas:
o si no necesita preocuparse por nulo:
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):
fuente
intValue
? Además, va a unbox a long, cast a int y rebox aInteger
, lo que no parece muy útil. No veo el punto en mi cabeza, ¿tienes una buena razón para esto?Long
along
primero, y luego aint
Aquí hay tres formas de hacerlo:
Las tres versiones generan un código de bytes casi idéntico:
fuente
123L
para facilitar la lectura.Para valores no nulos:
fuente
Si le interesa verificar si hay desbordamientos y tiene guayaba a mano, hay
Ints.checkedCast()
:La implementación es muy simple y arroja IllegalArgumentException en caso de desbordamiento:
fuente
Tendrás que escribir cast it.
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 .
fuente
Si está utilizando Java 8, hágalo de la siguiente manera
fuente
La mejor manera simple de hacerlo es:
fuente
En Java 8 puedes usar
toIntExact
. Si desea manejarnull
valores, use:Lo bueno de este método es que arroja un
ArithmeticException
si el argumento (long
) desborda unint
.fuente
Suponiendo que no sea nulo longVal
Funciona, por ejemplo, y obtienes un Objeto que puede ser un Entero o un Largo. Sé que es feo, pero sucede ...
fuente
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.
fuente
visitantes largos = 1000;
int convVisitors = (int) visitantes;
fuente
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.
fuente