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 étendue qu'un entier).
Voici trois façons de le faire:
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]
Integer intValue = myLong.intValue();
Si vous souhaitez vérifier les débordements et que vous avez Goyave pratique, il existe Ints.checkedCast()
:
int theInt = Ints.checkedCast(theLong);
L'implémentation est extrêmement simple et jette IllegalArgumentException on overflow:
public static int checkedCast(long value) {
int result = (int) value;
checkArgument(result == value, "Out of range: %s", value);
return result;
}
Vous devrez taper le lancer.
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 le documentation .
Si vous utilisez Java 8 Faites-le 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);
}
}
Le meilleur moyen 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;
}
En supposant que longVal n'est pas nul
Integer intVal = ((Number)longVal).intValue();
Cela fonctionne par exemple si vous obtenez un objet qui peut être un entier ou un long. Je sais que c'est moche, mais ça arrive ...
En Java 8, vous pouvez utiliser toIntExact
. Si vous voulez gérer les valeurs null
, utilisez:
Integer intVal = longVal == null ? null : Math.toIntExact(longVal);
La bonne chose à propos de cette méthode est qu’elle jette un ArithmeticException
si l’argument (long
) déborde de int
.
longs visiteurs = 1000;
int convVisitors = (int) visiteurs;
Utiliser toIntExact (valeur longue) renvoie la valeur de l'argument long, en lançant une exception si la valeur dépasse un entier cela fonctionnera uniquement avec les API de niveau 24 ou supérieur.
int id = Math.toIntExact(longId);