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

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]

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

1
Wygląda na znacznie czystsze niż (int) (długie) imo.
Gaʀʀʏ

Używam Long.valueOf (LONG_VARIABLE_HERE) .intValue ()
Francis Rodrigues


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


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

        }
}

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

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.


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


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

0

długich gości = 1000;

int convVisitors = (int) goście;


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

15
Myślę, że zapomniałeś gdzieś stworzyć fabrykę abstrakcyjną
user541686
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.