Réponses:
Integer i = theLong != null ? theLong.intValue() : null;
ou si vous n'avez pas à vous soucier de null:
// auto-unboxing does not go from Long to int directly, so
Integer i = (int) (long) theLong;
Et dans les deux situations, vous pourriez rencontrer des débordements (car un Long peut stocker une plage plus large qu'un Integer).
Java 8 a une méthode d'assistance qui vérifie les débordements (vous obtenez une exception dans ce cas):
Integer i = theLong == null ? null : Math.toIntExact(theLong);
intValue
place? De plus, il va déballer en long, cast en int et rebox en Integer
, ce qui ne semble pas très utile. Je ne vois pas le point au-dessus de ma tête, avez-vous une bonne raison à cela?
Long
en long
premier, puis enint
Voici trois façons de procéder:
Long l = 123L;
Integer correctButComplicated = Integer.valueOf(l.intValue());
Integer withBoxing = l.intValue();
Integer terrible = (int) (long) l;
Les trois versions génèrent un code octet presque identique:
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
pour plus de lisibilité.
Pour les valeurs non nulles:
Integer intValue = myLong.intValue();
Si vous souhaitez vérifier les débordements et avoir de la goyave à portée de main, il y a Ints.checkedCast()
:
int theInt = Ints.checkedCast(theLong);
L'implémentation est simple et lève IllegalArgumentException en cas de débordement:
public static int checkedCast(long value) {
int result = (int) value;
checkArgument(result == value, "Out of range: %s", value);
return result;
}
Vous devrez taper cast it.
long i = 100L;
int k = (int) i;
Gardez à l'esprit qu'un long a une plage plus grande qu'un int, vous risquez donc de perdre des données.
Si vous parlez des types encadrés, lisez la documentation .
Si vous utilisez Java 8, procédez comme ci-dessous
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);
}
}
La meilleure façon simple de le faire est:
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;
}
Dans Java 8, vous pouvez utiliser toIntExact
. Si vous souhaitez gérer des null
valeurs, utilisez:
Integer intVal = longVal == null ? null : Math.toIntExact(longVal);
Une bonne chose à propos de cette méthode est qu'elle lance un ArithmeticException
si l'argument ( long
) déborde d'un int
.
En supposant que nullVal longVal
Integer intVal = ((Number)longVal).intValue();
Cela fonctionne par exemple y vous obtenez un objet qui peut être un entier ou un long. Je sais que c'est moche, mais ça arrive ...
L'utilisation de toIntExact (valeur longue) renvoie la valeur de l'argument long, lançant une exception si la valeur déborde d'un int. cela ne fonctionnera que le niveau API 24 ou supérieur.
int id = Math.toIntExact(longId);
En java, il existe un moyen rigoureux de convertir un long en int
non seulement lnog peut se convertir en int, tout type de classe étend Number peut être converti en un autre type Number en général, ici je vais vous montrer comment convertir un long en int, un autre type vice versa.
Long l = 1234567L;
int i = org.springframework.util.NumberUtils.convertNumberToTargetClass(l, Integer.class);