Antworten:
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);
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?
Longauf den longersten und dann aufint
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]
123LLesbarkeit sollten Sie wahrscheinlich das Suffix in Großbuchstaben verwenden .
Für Nicht-Null-Werte:
Integer intValue = myLong.intValue();
Wenn Sie nach Überläufen suchen und Guave zur Hand haben möchten , gibt es Ints.checkedCast():
int theInt = Ints.checkedCast(theLong);
Die Implementierung ist denkbar einfach und löst beim Überlauf eine IllegalArgumentException aus:
public static int checkedCast(long value) {
int result = (int) value;
checkArgument(result == value, "Out of range: %s", value);
return result;
}
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 .
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);
}
}
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;
}
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.
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 ...
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);
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);