Converti Long in Integer


Risposte:


500
Integer i = theLong != null ? theLong.intValue() : null;

o se non devi preoccuparti di null:

// auto-unboxing does not go from Long to int directly, so
Integer i = (int) (long) theLong;

E in entrambe le situazioni, potresti incorrere in overflow (perché un Long può memorizzare un intervallo più ampio di un intero).

Java 8 ha un metodo di supporto che controlla l'overflow (in questo caso si ottiene un'eccezione):

Integer i = theLong == null ? null : Math.toIntExact(theLong);

5
È la risposta migliore perché gestisce i valori NULL.
Viacheslav Dobromyslov,

3
@ViacheslavDobromyslov la domanda riguardava i valori Long, non i valori null. E personalmente credo nel rifiutare null in anticipo piuttosto che usare null in -> null out e quindi trasportare null attraverso la mia applicazione. Quindi si potrebbe anche sostenere che questa è la risposta peggiore :-)
Sean Patrick Floyd l'

1
Perché dovresti lanciare due volte quando puoi semplicemente chiamare intValue? Inoltre, unbox to long, cast to int e rebox to Integer, che non sembra molto utile. Non vedo il punto in cima alla mia testa, hai una buona ragione per questo?
Dici,

Ricevo l'errore: Impossibile richiamare intValue () sul tipo primitivo long
Anand,

1
@Thilo oh, ho capito. In sostanza si sta convertendo Longa longprima, e poi aint
mrid

123

Ecco tre modi per farlo:

Long l = 123L;
Integer correctButComplicated = Integer.valueOf(l.intValue());
Integer withBoxing = l.intValue();
Integer terrible = (int) (long) l;

Tutte e tre le versioni generano un codice byte quasi identico:

 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
Piccolo problema di stile: probabilmente dovresti usare il suffisso maiuscolo 123Lper la leggibilità.
Joey,

Oppure puoi usare un buon carattere ... ed eccoci di nuovo qui ...: D (solo j / k, lo faccio anche io)
davidcsb

@ViacheslavDobromyslov true. la domanda riguardava Long, non nulla
Sean Patrick Floyd,

2
@SeanPatrickFloyd yep. Non dimenticare che il valore della variabile Long potrebbe essere NULL a volte.
Viacheslav Dobromyslov,

2
@ user64141 Il casting dei tipi in Java è un problema complicato. Casting Objects va bene, perché in realtà non stai cambiando nulla, stai solo guardando lo stesso oggetto in modo diverso. Ma in questo caso, hai una catena di cast significativi, dall'Oggetto alla primitiva e poi, attraverso la follia dell'autoboxing, all'obiezione di nuovo, anche se la sintassi suggerisce che è un'altra primitiva. Per me, questo è un uso improprio della boxe e della conversione primitiva. Non tutto ciò che può essere fatto dovrebbe essere fatto.
Sean Patrick Floyd,

48

Per valori non nulli:

Integer intValue = myLong.intValue();

1
Sembra molto più pulito di (int) (long) imo.
Gaʀʀʏ

Uso Long.valueOf (LONG_VARIABLE_HERE) .intValue ()
Francis Rodrigues,


8

Dovrai digitare cast.

long i = 100L;
int k = (int) i;

Tieni presente che un long ha un intervallo più ampio di un int, quindi potresti perdere dati.

Se stai parlando dei tipi in scatola, quindi leggi la documentazione .


6

Se stai usando Java 8 Fallo come sotto

    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

Il miglior modo semplice per farlo è:

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

In Java 8 puoi usare toIntExact. Se si desidera gestire i nullvalori, utilizzare:

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

La cosa buona di questo metodo è che genera un ArithmeticExceptionif l'argomento ( long) trabocca un int.


3

Supponendo non null longVal

Integer intVal = ((Number)longVal).intValue();

Funziona ad esempio se ottieni un oggetto che può essere un numero intero o un valore lungo. So che è brutto, ma succede ...


2

L'uso di toIntExact (valore lungo) restituisce il valore dell'argomento long, generando un'eccezione se il valore trabocca un int. funzionerà solo a livello API 24 o superiore.

int id = Math.toIntExact(longId);

0

visitatori lunghi = 1000;

int convVisitors = (int) visitatori;


-2

In java, esiste un modo rigoroso per convertire un long in int

non solo lnog può convertire in int, qualsiasi tipo di classe si estende Numero può convertire in altro tipo di numero in generale, qui ti mostrerò come convertire un lungo in int, altro tipo viceversa.

Long l = 1234567L;
int i = org.springframework.util.NumberUtils.convertNumberToTargetClass(l, Integer.class);

15
Penso che ti sia dimenticato di creare una fabbrica astratta da qualche parte
user541686,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.