Long in Integer konvertieren

Antworten:

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

oder wenn Sie sich keine Sorgen um null machen müssen:

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

In beiden Situationen kann es zu Überläufen kommen (da ein Long einen größeren Bereich als eine Ganzzahl speichern kann).

Java 8 verfügt über eine Hilfsmethode, die auf Überlauf prüft (in diesem Fall erhalten Sie eine Ausnahme):

Integer i = theLong == null ? null : Math.toIntExact(theLong);
Thilo
quelle
5
Dies ist die beste Antwort, da NULL-Werte verarbeitet werden.
Viacheslav Dobromyslov
3
@ViacheslavDobromyslov Die Frage betraf lange Werte, nicht Nullwerte. Und ich persönlich glaube daran, null im Voraus abzulehnen, anstatt null in -> null out zu verwenden und dadurch null durch meine Anwendung zu transportieren. Man könnte also auch argumentieren, dass dies die schlechteste Antwort ist :-)
Sean Patrick Floyd
1
Warum würdest du zweimal wirken, wenn du intValuestattdessen einfach anrufen kannst ? Außerdem wird es zu lange entpackt Integer, in int umgewandelt und in neu verpackt , was nicht sehr nützlich zu sein scheint. Ich sehe den Punkt nicht auf meinem Kopf. Hast du einen guten Grund dafür?
Dici
Ich erhalte die Fehlermeldung: IntValue () kann für den primitiven Typ nicht lange aufgerufen werden
Anand
1
@Thilo oh, ich verstehe. Grundsätzlich sind die Umwandlung Sie Longauf den longersten und dann aufint
MRID
123

Hier sind drei Möglichkeiten, dies zu tun:

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

Alle drei Versionen generieren nahezu identischen Bytecode:

 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
quelle
12
Kleinere stilistische Probleme: Zur besseren 123LLesbarkeit sollten Sie wahrscheinlich das Suffix in Großbuchstaben verwenden .
Joey
Oder Sie können eine gute Schriftart verwenden ... und jetzt geht es wieder los ...: D (nur j / k, das mache ich auch)
davidcsb
@ViacheslavDobromyslov wahr. Die Frage war über Long, nicht null
Sean Patrick Floyd
2
@ SeanPatrickFloyd yep. Vergessen Sie nicht, dass der Wert der Variablen Long manchmal NULL sein kann.
Viacheslav Dobromyslov
2
@ user64141 Typumwandlung in Java ist ein kompliziertes Problem. Das Casting von Objekten ist in Ordnung, da Sie eigentlich nichts ändern, sondern nur dasselbe Objekt auf andere Weise betrachten. In diesem Fall haben Sie jedoch eine Reihe bedeutungsvoller Besetzungen, von Objekt zu Primitiv und dann durch den Wahnsinn des Autoboxing erneut zu Objekt, obwohl die Syntax darauf hindeutet, dass es sich um ein anderes Primitiv handelt. Für mich ist dies ein Missbrauch sowohl des Boxens als auch der primitiven Bekehrung. Nicht alles, was getan werden kann, sollte getan werden.
Sean Patrick Floyd
48

Für Nicht-Null-Werte:

Integer intValue = myLong.intValue();
vogelig
quelle
1
Sieht viel sauberer aus als (int) (long) imo.
Gaʀʀʏ
Ich benutze Long.valueOf (LONG_VARIABLE_HERE) .intValue ()
Francis Rodrigues
8

Sie müssen cast it eingeben.

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

Denken Sie daran, dass ein Long eine größere Reichweite als ein Int hat, sodass Sie möglicherweise Daten verlieren.

Wenn Sie über die Box-Typen sprechen, lesen Sie die Dokumentation .

Jeff Foster
quelle
6

Wenn Sie Java 8 verwenden, gehen Sie wie folgt vor

    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
quelle
5

Der einfachste Weg, dies zu tun, ist:

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
quelle
4

In Java 8 können Sie verwenden toIntExact. Wenn Sie mit nullWerten umgehen möchten , verwenden Sie:

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

Das Gute an dieser Methode ist, dass sie ein ArithmeticExceptionif auslöst, wenn das Argument ( long) überläuft int.

Jasper de Vries
quelle
3

Angenommen, nicht null longVal

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

Es funktioniert zum Beispiel, wenn Sie ein Objekt erhalten, das eine Ganzzahl oder eine Länge sein kann. Ich weiß, dass das hässlich ist, aber es passiert ...

Edwin Miguel
quelle
2

Die Verwendung von toIntExact (langer Wert) gibt den Wert des langen Arguments zurück und löst eine Ausnahme aus, wenn der Wert ein int überschreitet. Es funktioniert nur mit API-Level 24 oder höher.

int id = Math.toIntExact(longId);
Anjal Saneen
quelle
0

lange Besucher = 1000;

int convVisitors = (int) Besucher;

Bala
quelle
-2

In Java gibt es eine strenge Möglichkeit, ein Long in Int umzuwandeln

Nicht nur lnog kann in int konvertieren, jeder Klassentyp erweitert Number kann generell in einen anderen Number-Typ konvertiert werden. Hier zeige ich Ihnen, wie Sie einen Long in int konvertieren können, einen anderen Typ umgekehrt.

Long l = 1234567L;
int i = org.springframework.util.NumberUtils.convertNumberToTargetClass(l, Integer.class);
tsaowe
quelle
15
Ich denke, Sie haben vergessen, irgendwo eine abstrakte Fabrik zu erstellen
user541686