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

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]

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

1
Parece muito mais limpo que (int) (longo) imo.
Gaʀʀʏ

Eu uso Long.valueOf (LONG_VARIABLE_HERE) .intValue ()
Francis Rodrigues


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 .


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

        }
}

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

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.


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


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

0

visitantes longos = 1000;

int convVisitors = (int) visitantes;


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

15
Eu acho que você esqueceu de criar um lugar de fábrica abstrata
user541686
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.