Odpowiedzi:
Integer i = theLong != null ? theLong.intValue() : null;
lub jeśli nie musisz się martwić o zero:
// auto-unboxing does not go from Long to int directly, so
Integer i = (int) (long) theLong;
I w obu sytuacjach możesz napotkać przepełnienia (ponieważ Długi może przechowywać szerszy zasięg niż Liczba całkowita).
Java 8 ma metodę pomocniczą, która sprawdza przepełnienie (w takim przypadku pojawia się wyjątek):
Integer i = theLong == null ? null : Math.toIntExact(theLong);
intValuezamiast tego możesz po prostu zadzwonić ? Dodatkowo rozpakuje się na długi, rzutuje na int i ponownie pudełko Integer, co nie wydaje się bardzo przydatne. Nie widzę sensu w głowie, czy masz ku temu dobry powód?
Longna longnajpierw, a potem naint
Oto trzy sposoby, aby to zrobić:
Long l = 123L;
Integer correctButComplicated = Integer.valueOf(l.intValue());
Integer withBoxing = l.intValue();
Integer terrible = (int) (long) l;
Wszystkie trzy wersje generują prawie identyczny kod bajtowy:
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]
123Lz dużymi literami dla zwiększenia czytelności.
W przypadku wartości niepustych:
Integer intValue = myLong.intValue();
Jeśli chcesz sprawdzić przepełnienia i mieć pod ręką Guava , możesz Ints.checkedCast():
int theInt = Ints.checkedCast(theLong);
Implementacja jest bardzo prosta i zgłasza wyjątek IllegalArgumentException w przypadku przepełnienia:
public static int checkedCast(long value) {
int result = (int) value;
checkArgument(result == value, "Out of range: %s", value);
return result;
}
Musisz wpisać cast.
long i = 100L;
int k = (int) i;
Pamiętaj, że długi ma większy zasięg niż int, więc możesz stracić dane.
Jeśli mówisz o typach pudełkowych, przeczytaj dokumentację .
Jeśli używasz Java 8 Zrób to jak poniżej
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);
}
}
Najlepszy prosty sposób to:
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;
}
W Javie 8 możesz używać toIntExact. Jeśli chcesz obsługiwać nullwartości, użyj:
Integer intVal = longVal == null ? null : Math.toIntExact(longVal);
Dobrą rzeczą w tej metodzie jest to, że wyrzuca ona, ArithmeticExceptionjeśli argument ( long) przepełnia an int.
Zakładając, że nie jest zerowy longVal
Integer intVal = ((Number)longVal).intValue();
Działa na przykład, gdy otrzymujesz Obiekt, który może być liczbą całkowitą lub długą. Wiem, że to brzydkie, ale zdarza się ...
Użycie toIntExact (długa wartość) zwraca wartość długiego argumentu, zgłaszając wyjątek, jeśli wartość przepełnia wartość int. będzie działał tylko interfejs API na poziomie 24 lub wyższym.
int id = Math.toIntExact(longId);
W java istnieje rygorystyczny sposób konwersji długiej na int
nie tylko lnog może konwertować na int, każdy typ rozszerza klasę Liczba może konwertować na inny typ liczbowy ogólnie, tutaj pokażę, jak przekonwertować long na int, inny typ vice versa.
Long l = 1234567L;
int i = org.springframework.util.NumberUtils.convertNumberToTargetClass(l, Integer.class);