1. Introducción
La conversión de una cadena a un int o Entero es una operación muy común en Java. En este artículo, mostraremos varias formas de abordar este problema.
Hay algunas formas sencillas de abordar esta conversión básica.
2. Integer.parseInt ()
Una de las principales soluciones es utilizar el método estático dedicado de Integer : parseInt () , que devuelve un valor int primitivo :
@Test public void givenString_whenParsingInt_shouldConvertToInt() { String givenString = "42"; int result = Integer.parseInt(givenString); assertThat(result).isEqualTo(42); }
De forma predeterminada, el método parseInt () asume que el String dado es un entero de base 10. Además, este método acepta otro argumento para cambiar esta base predeterminada . Por ejemplo, podemos analizar cadenas binarias de la siguiente manera:
@Test public void givenBinaryString_whenParsingInt_shouldConvertToInt() { String givenString = "101010"; int result = Integer.parseInt(givenString, 2); assertThat(result).isEqualTo(42); }
Naturalmente, también es posible utilizar este método con cualquier otra base como 16 (hexadecimal) u 8 (octal).
3. Integer.valueOf ()
Otra opción sería usar el método estático Integer.valueOf () , que devuelve una instancia de Integer :
@Test public void givenString_whenCallingIntegerValueOf_shouldConvertToInt() { String givenString = "42"; Integer result = Integer.valueOf(givenString); assertThat(result).isEqualTo(new Integer(42)); }
De manera similar, el método valueOf () también acepta una base personalizada como segundo argumento:
@Test public void givenBinaryString_whenCallingIntegerValueOf_shouldConvertToInt() { String givenString = "101010"; Integer result = Integer.valueOf(givenString, 2); assertThat(result).isEqualTo(new Integer(42)); }
3.1. Caché de enteros
A primera vista, puede parecer que los métodos valueOf () y parseInt () son exactamente iguales. En su mayor parte, esto es cierto, incluso el método valueOf () delega al método parseInt internamente.
Sin embargo, hay una diferencia sutil entre estos dos métodos: el método valueOf () utiliza una caché de enteros internamente . Esta caché devolvería la misma instancia de Integer para números entre -128 y 127 :
@Test public void givenString_whenCallingValueOf_shouldCacheSomeValues() { for (int i = -128; i <= 127; i++) { String value = i + ""; Integer first = Integer.valueOf(value); Integer second = Integer.valueOf(value); assertThat(first).isSameAs(second); } }
Por lo tanto, es muy recomendable usar valueOf () en lugar de parseInt () para extraer enteros en caja, ya que puede conducir a una mejor huella general para nuestra aplicación.
4. Constructor de enteros
También puede usar el constructor de Integer :
@Test public void givenString_whenCallingIntegerConstructor_shouldConvertToInt() { String givenString = "42"; Integer result = new Integer(givenString); assertThat(result).isEqualTo(new Integer(42)); }
A partir de Java 9, este constructor ha quedado obsoleto en favor de otros métodos de fábrica estáticos como valueOf () o parseInt () . Incluso antes de esta desaprobación, rara vez era apropiado utilizar este constructor. Deberíamos usar parseInt () para convertir una cadena en una primitiva int o usar valueOf () para convertirla en un objeto Integer .
5. Integer.decode ()
Además, Integer.decode () funciona de manera similar a Integer.valueOf (), pero también puede aceptar diferentes representaciones de números:
@Test public void givenString_whenCallingIntegerDecode_shouldConvertToInt() { String givenString = "42"; int result = Integer.decode(givenString); assertThat(result).isEqualTo(42); }
6. NumberFormatException
Todos los métodos mencionados anteriormente arrojan una NumberFormatException, cuando encuentran valores de cadena inesperados . Aquí puede ver un ejemplo de tal situación:
@Test(expected = NumberFormatException.class) public void givenInvalidInput_whenParsingInt_shouldThrow() { String givenString = "nan"; Integer.parseInt(givenString); }
7. Con Guayaba
Por supuesto, no necesitamos ceñirnos al núcleo de Java. Así es como se puede lograr lo mismo usando Ints.tryParse () de Guava , que devuelve un valor nulo si no puede analizar la entrada:
@Test public void givenString_whenTryParse_shouldConvertToInt() { String givenString = "42"; Integer result = Ints.tryParse(givenString); assertThat(result).isEqualTo(42); }
Además, el método tryParse () también acepta un segundo argumento de base similar a parseInt () y valueOf ().
8. Conclusión
En este artículo, hemos explorado varias formas de convertir instancias de String en instancias int o Integer .
Por supuesto, todos los ejemplos de código se pueden encontrar en GitHub.