Converter tempo em inteiro

Respostas:

500
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);
Thilo
fonte
5
É a melhor resposta porque lida com valores NULL.
Viacheslav Dobromyslov 06/04
3
@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:

 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
fonte
12
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.
Sean Patrick Floyd
48

Para valores não nulos:

Integer intValue = myLong.intValue();
birdy
fonte
1
Parece muito mais limpo que (int) (longo) imo.
Gaʀʀʏ
Eu uso Long.valueOf (LONG_VARIABLE_HERE) .intValue ()
Francis Rodrigues
20

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;
}
Jacob Marble
fonte
8

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 .

Jeff Foster
fonte
6

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

        }
}
Dushyant Sapra
fonte
5

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

No Java 8 você pode usar toIntExact. Se você deseja manipular nullvalores, use:

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

O bom desse método é que ele lança um ArithmeticExceptionse o argumento ( long) estourar um int.

Jasper de Vries
fonte
3

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

Edwin Miguel
fonte
2

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);
Anjal Saneen
fonte
0

visitantes longos = 1000;

int convVisitors = (int) visitantes;

Bala
fonte
-2

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);
tsaowe
fonte
15
Eu acho que você esqueceu de criar um lugar de fábrica abstrata
user541686