Respostas:
Integer i = theLong != null ? theLong.intValue() : null;
ou se você não precisar se preocupar com nulo:
// auto-unboxing does not go from Long to int directly, so
Integer i = (int) (long) theLong;
E nas duas situações, você pode encontrar estouros (porque um Long pode armazenar um intervalo maior que um Inteiro).
O Java 8 possui um método auxiliar que verifica o estouro (você recebe uma exceção nesse caso):
Integer i = theLong == null ? null : Math.toIntExact(theLong);
intValue
? Além disso, ele vai unbox para long, cast para int e rebox para Integer
, o que não parece muito útil. Não vejo o ponto em cima da minha cabeça, você tem uma boa razão para isso?
Long
a long
primeira, e depoisint
Aqui estão três maneiras de fazer isso:
Long l = 123L;
Integer correctButComplicated = Integer.valueOf(l.intValue());
Integer withBoxing = l.intValue();
Integer terrible = (int) (long) l;
Todas as três versões geram código de bytes quase 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]
123L
para facilitar a leitura.
Para valores não nulos:
Integer intValue = myLong.intValue();
Se você deseja verificar se há estouros e tiver o Guava à mão, existe Ints.checkedCast()
:
int theInt = Ints.checkedCast(theLong);
A implementação é simples e lança IllegalArgumentException no estouro:
public static int checkedCast(long value) {
int result = (int) value;
checkArgument(result == value, "Out of range: %s", value);
return result;
}
Você precisará digitar o elenco.
long i = 100L;
int k = (int) i;
Lembre-se de que um longo tem um intervalo maior que um int, para que você possa perder dados.
Se você estiver falando sobre os tipos de caixas, leia a documentação .
Se você estiver usando o Java 8, faça o seguinte
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);
}
}
A melhor maneira simples de fazer isso é:
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;
}
No Java 8 você pode usar toIntExact
. Se você deseja manipular null
valores, use:
Integer intVal = longVal == null ? null : Math.toIntExact(longVal);
O bom desse método é que ele lança um ArithmeticException
se o argumento ( long
) estourar um int
.
Supondo que não seja longVal nulo
Integer intVal = ((Number)longVal).intValue();
Funciona, por exemplo, e você obtém um Objeto que pode ser um Inteiro ou um Longo. Eu sei que é feio, mas acontece ...
Usar toIntExact (valor longo) retorna o valor do argumento longo, lançando uma exceção se o valor exceder um valor int. funcionará apenas no nível da API 24 ou superior.
int id = Math.toIntExact(longId);
Em java, existe uma maneira rigorosa de converter um tempo para int
não apenas o lnog pode converter em int, qualquer tipo de classe estende Number pode converter para outro tipo de Number em geral, aqui mostrarei como converter um comprimento em int, outro tipo vice-versa.
Long l = 1234567L;
int i = org.springframework.util.NumberUtils.convertNumberToTargetClass(l, Integer.class);