Risposte:
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);
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?
Long
a long
prima, e poi aint
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]
123L
per la leggibilità.
Per valori non nulli:
Integer intValue = myLong.intValue();
Se ti interessa controllare gli overflow e hai Guava a portata di mano, c'è Ints.checkedCast()
:
int theInt = Ints.checkedCast(theLong);
L'implementazione è semplicissima e genera IllegalArgumentException su overflow:
public static int checkedCast(long value) {
int result = (int) value;
checkArgument(result == value, "Out of range: %s", value);
return result;
}
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 .
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);
}
}
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;
}
In Java 8 puoi usare toIntExact
. Se si desidera gestire i null
valori, utilizzare:
Integer intVal = longVal == null ? null : Math.toIntExact(longVal);
La cosa buona di questo metodo è che genera un ArithmeticException
if l'argomento ( long
) trabocca un int
.
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 ...
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);
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);