2011-04-27 10 views

Odpowiedz

361
Integer i = theLong != null ? theLong.intValue() : null; 

lub jeśli nie trzeba się martwić o wartości null:

// auto-unboxing does not go from Long to int directly, so 
Integer i = (int) (long) theLong; 

I w obu przypadkach, może napotkasz przepełnienia (bo długo można przechowywać szerszy zasięg niż całkowita).

+4

To najlepsza odpowiedź, ponieważ obsługuje wartości NULL. –

+1

@ViacheslavDobromyslov pytanie dotyczyło wartości Long, a nie wartości pustych.I osobiście wierzę w odrzucanie wartości zerowej z góry, zamiast używania null w -> null out, a tym samym transportu null przez moją aplikację. Można więc również twierdzić, że jest to najgorsza odpowiedź :-) –

+1

Dlaczego miałbyś rzucać dwa razy, gdy możesz po prostu nazwać "intValue" zamiast? Plus to będzie unbox do long, cast do int, i rebox do 'Integer', co nie wydaje się zbyt przydatne. Nie widzę sensu na głowie, czy masz ku temu dobry powód? – Dici

5

Musisz wpisać go.

long i = 100L; 
int k = (int) i; 

Pamiętaj, że długi ma większy zasięg niż int, więc możesz utracić dane.

Jeśli mówisz o typach pudełkowych, przeczytaj artykuł documentation.

40
Integer intValue = myLong.intValue(); 
+0

Wygląda o wiele czystszy niż (int) (długo) imo. –

+2

To nie działa z wartością NULL –

+0

@ViacheslavDobromyslov tak, masz rację. To oczywiste, – birdy

106

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ą niemal 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] 
+10

Drobne zagadnienie stylistyki: Powinieneś raczej używać przyrostka '123L' dla większych liter dla czytelności. – Joey

+0

Albo możesz użyć dobrej czcionki ... i znowu zaczynamy ...: D (tylko j/k, ja też to robię) – davidcesarino

+3

To nie działa z wartością NULL –

-3

w Javie, nie jest rygorystyczny sposób przekonwertować długa do int

nie tylko lnog może konwertować na int, każdy typ klasy się rozszerza Liczba może konwertować do innych Numbe r typ ogólnie, tutaj pokażę ci, jak konwertować długi na int, inny na odwrót.

Long l = 1234567L; 
int i = org.springframework.util.NumberUtils.convertNumberToTargetClass(l, Integer.class); 
+4

Skomplikowane! – genobis

+10

Myślę, że zapomniałeś stworzyć abstrakcyjną fabrykę gdzieś – Mehrdad

18

Jeśli zależy Ci, aby sprawdzić, przelewów i mają Guava poręczny, istnieje Ints.checkedCast():

int theInt = Ints.checkedCast(theLong); 

The implementation jest martwe proste i rzuca IllegalArgumentException na overflow:

public static int checkedCast(long value) { 
    int result = (int) value; 
    checkArgument(result == value, "Out of range: %s", value); 
    return result; 
} 
4

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

Zakładając not null longVal

Integer intVal = ((Number)longVal).intValue(); 

to działa na przykład y można uzyskać obiekt, który może być całkowita lub długi. Wiem, że jest brzydki, ale to się zdarza ...

4

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

     } 
} 
0

długich zwiedzających = 1000;

int convVisitors = (int) goście;