@ViacheslavDobromyslov, a pergunta era sobre valores longos, não valores nulos. E, pessoalmente, acredito em rejeitar nulo antecipadamente, em vez de usar nulo in -> null out e, assim, transportar nulo através do meu aplicativo. Assim, também se poderia argumentar que isso é a pior resposta :-)
Sean Patrick Floyd
1
Por que você transmitiu duas vezes quando pode simplesmente ligar 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?
Dici 14/07/16
Estou recebendo o erro: Não é possível invocar intValue () no tipo primitivo por muito tempo
Anand
1
@ Thilo oh, entendi. Basicamente, você está convertendo Longa longprimeira, e depoisint
mrid
123
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:
Problema estilístico menor: você provavelmente deve usar o sufixo maiúsculo 123Lpara facilitar a leitura.
Joey
Ou você pode usar uma boa fonte ... e aqui vamos nós de novo ...: D (apenas j / k, eu também faço isso) #
davidcsb #
@ViacheslavDobromyslov true. a pergunta era sobre Long, não null
Sean Patrick Floyd
2
@SeanPatrickFloyd yep. Não esqueça que o valor da variável Long pode ser NULL às vezes.
Viacheslav Dobromyslov
2
@ user64141 A conversão de tipos em Java é um problema complicado. Casting Objects é bom, porque na verdade você não está alterando nada, apenas olhando para o mesmo objeto de uma maneira diferente. Mas, neste caso, você tem uma cadeia de elencos significativos, de Objeto a primitivo e, em seguida, através da loucura do autoboxing, objetar novamente, mesmo que a sintaxe sugira que seja outra primitiva. Para mim, isso é um mau uso do boxe e da conversão primitiva. Nem tudo o que pode ser feito deve ser feito.
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;}
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.
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);
Respostas:
ou se você não precisar se preocupar com nulo:
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):
fonte
intValue
? Além disso, ele vai unbox para long, cast para int e rebox paraInteger
, 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
along
primeira, e depoisint
Aqui estão três maneiras de fazer isso:
Todas as três versões geram código de bytes quase idêntico:
fonte
123L
para facilitar a leitura.Para valores não nulos:
fonte
Se você deseja verificar se há estouros e tiver o Guava à mão, existe
Ints.checkedCast()
:A implementação é simples e lança IllegalArgumentException no estouro:
fonte
Você precisará digitar o elenco.
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 .
fonte
Se você estiver usando o Java 8, faça o seguinte
fonte
A melhor maneira simples de fazer isso é:
fonte
No Java 8 você pode usar
toIntExact
. Se você deseja manipularnull
valores, use:O bom desse método é que ele lança um
ArithmeticException
se o argumento (long
) estourar umint
.fonte
Supondo que não seja longVal nulo
Funciona, por exemplo, e você obtém um Objeto que pode ser um Inteiro ou um Longo. Eu sei que é feio, mas acontece ...
fonte
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.
fonte
visitantes longos = 1000;
int convVisitors = (int) visitantes;
fonte
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.
fonte