Convertir long en entier

Réponses:

500
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);
Thilo
la source
5
C'est la meilleure réponse car elle gère les valeurs NULL.
Viacheslav Dobromyslov
3
@ViacheslavDobromyslov, la question portait sur les valeurs longues, pas sur les valeurs nulles. Et personnellement, je crois en rejetant null à l'avance plutôt qu'en utilisant null in -> null out et en transportant ainsi null via mon application. On pourrait donc aussi affirmer que c'est la pire réponse :-)
Sean Patrick Floyd
1
Pourquoi voudriez-vous lancer deux fois quand vous pouvez simplement appeler à la intValueplace? 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?
Dici
J'obtiens l'erreur: impossible d'appeler intValue () sur le type primitif long
Anand
1
@Thilo oh, je comprends. Fondamentalement, vous vous convertissez Longen longpremier, puis enint
mrid
123

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]
Sean Patrick Floyd
la source
12
Problème de style mineur: vous devriez probablement utiliser le suffixe majuscule 123Lpour plus de lisibilité.
Joey
Ou vous pouvez utiliser une bonne police ... et c'est reparti ...: D (juste j / k, je fais aussi ça)
davidcsb
@ViacheslavDobromyslov true. la question portait sur Long, not null
Sean Patrick Floyd
2
@SeanPatrickFloyd yep. N'oubliez pas que la valeur de la variable Long peut parfois être NULL.
Viacheslav Dobromyslov
2
@ user64141 La conversion de type en Java est un problème compliqué. Casting Objects est très bien, car vous ne changez rien, vous regardez simplement le même objet d'une manière différente. Mais dans ce cas, vous avez une chaîne de transtypages significatifs, de l'objet à la primitive, puis, à travers la folie de l'autoboxing, à objecter à nouveau, même si la syntaxe suggère qu'il s'agit d'une autre primitive. Pour moi, c'est une mauvaise utilisation de la boxe et de la conversion primitive. Tout ce qui peut être fait ne doit pas être fait.
Sean Patrick Floyd
48

Pour les valeurs non nulles:

Integer intValue = myLong.intValue();
birdy
la source
1
Semble beaucoup plus propre que (int) (long) imo.
Gaʀʀʏ
J'utilise Long.valueOf (LONG_VARIABLE_HERE) .intValue ()
Francis Rodrigues
20

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;
}
Jacob Marble
la source
8

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 .

Jeff Foster
la source
6

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

        }
}
Dushyant Sapra
la source
5

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;
    }
Adi
la source
4

Dans Java 8, vous pouvez utiliser toIntExact. Si vous souhaitez gérer des nullvaleurs, utilisez:

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

Une bonne chose à propos de cette méthode est qu'elle lance un ArithmeticExceptionsi l'argument ( long) déborde d'un int.

Jasper de Vries
la source
3

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

Edwin Miguel
la source
2

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);
Anjal Saneen
la source
0

visiteurs longs = 1000;

int convVisitors = (int) visiteurs;

Bala
la source
-2

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);
tsaowe
la source
15
Je pense que vous avez oublié de créer une usine abstraite quelque part
user541686