Konwertuj Long na Liczba całkowita

Odpowiedzi:

500
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);
Thilo
źródło
5
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:

 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
źródło
12
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.
Sean Patrick Floyd,
48

W przypadku wartości niepustych:

Integer intValue = myLong.intValue();
ptak
źródło
1
Wygląda na znacznie czystsze niż (int) (długie) imo.
Gaʀʀʏ
Używam Long.valueOf (LONG_VARIABLE_HERE) .intValue ()
Francis Rodrigues
20

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;
}
Jacob Marble
źródło
8

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

Jeff Foster
źródło
6

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

        }
}
Dushyant Sapra
źródło
5

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;
    }
Adi
źródło
4

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.

Jasper de Vries
źródło
3

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

Edwin Miguel
źródło
2

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);
Anjal Saneen
źródło
0

długich gości = 1000;

int convVisitors = (int) goście;

Bala
źródło
-2

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);
tsaowe
źródło
15
Myślę, że zapomniałeś gdzieś stworzyć fabrykę abstrakcyjną
user541686