To najlepsza odpowiedź, ponieważ obsługuje wartości NULL.
Viacheslav Dobromyslov
3
@ViacheslavDobromyslov pytanie dotyczyło długich wartości, a nie wartości zerowych. I osobiście wierzę w odrzucenie null z góry zamiast używania null in -> null out, a tym samym transportowania null przez moją aplikację. Można więc argumentować, że to najgorsza odpowiedź :-)
Sean Patrick Floyd
1
Dlaczego miałbyś rzucić dwa razy, skoro 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?
Dici
Pojawia się błąd: nie można długo wywoływać metody intValue () na typie pierwotnym
Anand
1
@Thilo, och, rozumiem. Zasadniczo konwertujesz Longna longnajpierw, a potem naint
mrid
123
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:
Drobny problem styliustyczny: Prawdopodobnie powinieneś użyć przyrostka 123Lz dużymi literami dla zwiększenia czytelności.
Joey,
Lub możesz użyć dobrej czcionki ... i znowu zaczynamy ...: D (tylko j / k, ja też to robię)
davidcsb
@ViacheslavDobromyslov true. pytanie dotyczyło Długiego, a nie zerowego
Sean Patrick Floyd
2
@SeanPatrickFloyd tak. Nie zapominaj, że wartość długiej zmiennej może czasami wynosić NULL.
Viacheslav Dobromyslov
2
@ user64141 Przesyłanie tekstu w Javie jest skomplikowanym problemem. Rzucanie obiektów jest w porządku, ponieważ tak naprawdę nic nie zmieniasz, tylko patrzysz na ten sam obiekt w inny sposób. Ale w tym przypadku masz łańcuch znaczących rzutów, od Object do prymitywnego, a następnie poprzez szaleństwo autoboxowania, aby ponownie sprzeciwić się, nawet jeśli składnia sugeruje, że jest to inny prymitywny. Dla mnie jest to niewłaściwe użycie zarówno boksu, jak i prymitywnej konwersji. Nie wszystko, co można zrobić, powinno być zrobione.
publicstaticint safeLongToInt(long longNumber ){if( longNumber <Integer.MIN_VALUE || longNumber >Integer.MAX_VALUE ){thrownewIllegalArgumentException( longNumber +" cannot be cast to int without changing its value.");}return(int) longNumber;}
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.
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);
Odpowiedzi:
lub jeśli nie musisz się martwić o zero:
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):
źródło
intValue
zamiast tego możesz po prostu zadzwonić ? Dodatkowo rozpakuje się na długi, rzutuje na int i ponownie pudełkoInteger
, co nie wydaje się bardzo przydatne. Nie widzę sensu w głowie, czy masz ku temu dobry powód?Long
nalong
najpierw, a potem naint
Oto trzy sposoby, aby to zrobić:
Wszystkie trzy wersje generują prawie identyczny kod bajtowy:
źródło
123L
z dużymi literami dla zwiększenia czytelności.W przypadku wartości niepustych:
źródło
Jeśli chcesz sprawdzić przepełnienia i mieć pod ręką Guava , możesz
Ints.checkedCast()
:Implementacja jest bardzo prosta i zgłasza wyjątek IllegalArgumentException w przypadku przepełnienia:
źródło
Musisz wpisać cast.
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ę .
źródło
Jeśli używasz Java 8 Zrób to jak poniżej
źródło
Najlepszy prosty sposób to:
źródło
W Javie 8 możesz używać
toIntExact
. Jeśli chcesz obsługiwaćnull
wartości, użyj:Dobrą rzeczą w tej metodzie jest to, że wyrzuca ona,
ArithmeticException
jeśli argument (long
) przepełnia anint
.źródło
Zakładając, że nie jest zerowy longVal
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ę ...
źródło
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.
źródło
długich gości = 1000;
int convVisitors = (int) goście;
źródło
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.
źródło