2011-04-27 17 views

Respuesta

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

o si usted no tiene que preocuparse por nulo:

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

Y en ambas situaciones, usted podría encontrarse con desbordamientos (debido a una larga puede almacenar un rango más amplio que un entero).

+4

Es la mejor respuesta porque maneja valores NULOS. –

+1

@ViacheslavDobromyslov la pregunta era sobre valores largos, no sobre valores nulos.Y personalmente creo en rechazar nulo por adelantado en lugar de usar null in -> null out y de ese modo transportar null a través de mi aplicación. Por lo tanto, también podría argumentarse que esta es la peor respuesta :-) –

+1

¿Por qué se lanzaría dos veces cuando se puede llamar 'intValue' en su lugar? Además, va a unbox a long, cast to int y rebox a 'Integer', que no parece muy útil. No veo el punto en mi cabeza, ¿tienes una buena razón para esto? – Dici

5

Tendrás que escribir cast it.

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

Tenga en cuenta que un largo tiene un rango mayor que un int, por lo que puede perder datos.

Si habla de los tipos encuadrados, lea el documentation.

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

Parece mucho más limpio que (int) (largo) imo. –

+2

No funciona con el valor NULO –

+0

@ViacheslavDobromyslov sí, tienes razón. Es obvio – birdy

106

Aquí hay tres maneras de hacerlo:

Long l = 123L; 
Integer correctButComplicated = Integer.valueOf(l.intValue()); 
Integer withBoxing = l.intValue(); 
Integer terrible = (int) (long) l; 

Las tres versiones generan código de bytes casi idéntica:

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

Problema menor de stylistic: Probablemente deberías usar el sufijo en mayúscula "123L" para facilitar la lectura. – Joey

+0

O puede usar una buena fuente ... y aquí vamos de nuevo ...: D (solo j/k, también lo hago) – davidcesarino

+3

No funciona con el valor NULO –

-3

en Java, hay una manera rigurosa para convertir un largo a int

no solo lnog puede convertir a int, cualquier tipo de clase se extiende Número puede convertir a otro Numbe r escriba en general, aquí le mostraré cómo convertir un largo a int, otro tipo viceversa.

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

¡Sobrecomplicado! – genobis

+10

Creo que se olvidó de crear una fábrica abstracta en algún lugar – Mehrdad

18

Si usted se preocupa de comprobar si hay desbordamientos y tienen Guava práctico, no es Ints.checkedCast():

int theInt = Ints.checkedCast(theLong); 

The implementation está muerto simple, y tiros IllegalArgumentException en caso de desbordamiento:

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

La mejor La manera simple de hacerlo es:

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

Suponiendo que no es nulo Longval

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

Funciona por ejemplo, y se obtiene un objeto que puede ser un número entero o una larga. Sé que es feo, pero sucede ...

4

Si está utilizando Java 8 Hágalo de la siguiente manera

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

largos visitantes = 1000;

int convVisitors = (int) visitantes;

Cuestiones relacionadas