Converti String in int o Integer in Java

1. Introduzione

La conversione di una stringa in un int o Integer è un'operazione molto comune in Java. In questo articolo, mostreremo diversi modi per affrontare questo problema.

Ci sono alcuni semplici modi per affrontare questa conversione di base.

2. Integer.parseInt ()

Una delle soluzioni principali è utilizzare il metodo statico dedicato di Integer : parseInt () , che restituisce un valore int primitivo :

@Test public void givenString_whenParsingInt_shouldConvertToInt() { String givenString = "42"; int result = Integer.parseInt(givenString); assertThat(result).isEqualTo(42); }

Per impostazione predefinita, il metodo parseInt () presuppone che la stringa data sia un numero intero in base 10. Inoltre, questo metodo accetta un altro argomento per modificare questa radice predefinita . Ad esempio, possiamo analizzare le stringhe binarie come segue:

@Test public void givenBinaryString_whenParsingInt_shouldConvertToInt() { String givenString = "101010"; int result = Integer.parseInt(givenString, 2); assertThat(result).isEqualTo(42); }

Naturalmente, è anche possibile utilizzare questo metodo con qualsiasi altra radice come 16 (esadecimale) o 8 (ottale).

3. Integer.valueOf ()

Un'altra opzione potrebbe essere quella di utilizzare il metodo statico Integer.valueOf () , che restituisce un'istanza Integer :

@Test public void givenString_whenCallingIntegerValueOf_shouldConvertToInt() { String givenString = "42"; Integer result = Integer.valueOf(givenString); assertThat(result).isEqualTo(new Integer(42)); }

Allo stesso modo, il metodo valueOf () accetta anche una radice personalizzata come secondo argomento:

@Test public void givenBinaryString_whenCallingIntegerValueOf_shouldConvertToInt() { String givenString = "101010"; Integer result = Integer.valueOf(givenString, 2); assertThat(result).isEqualTo(new Integer(42)); }

3.1. Cache intera

A prima vista, può sembrare che i metodi valueOf () e parseInt () siano esattamente gli stessi. Per la maggior parte, questo è vero, anche il metodo valueOf () delega internamente al metodo parseInt .

Tuttavia, c'è una sottile differenza tra questi due metodi: il metodo valueOf () utilizza internamente una cache di numeri interi . Questa cache restituirà la stessa istanza Integer per i numeri compresi tra -128 e 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); } }

Pertanto, si consiglia vivamente di utilizzare valueOf () invece di parseInt () per estrarre interi boxed in quanto potrebbe portare a una migliore impronta complessiva per la nostra applicazione.

4. Costruttore di Integer

Puoi anche usare il costruttore di Integer :

@Test public void givenString_whenCallingIntegerConstructor_shouldConvertToInt() { String givenString = "42"; Integer result = new Integer(givenString); assertThat(result).isEqualTo(new Integer(42)); }

A partire da Java 9, questo costruttore è stato deprecato a favore di altri metodi factory statici come valueOf () o parseInt () . Anche prima di questa deprecazione, raramente era appropriato utilizzare questo costruttore. Dovremmo usare parseInt () per convertire una stringa in una primitiva int o usare valueOf () per convertirla in un oggetto Integer .

5. Integer.decode ()

Inoltre, Integer.decode () funziona in modo simile a Integer.valueOf (), ma può anche accettare rappresentazioni numeriche diverse:

@Test public void givenString_whenCallingIntegerDecode_shouldConvertToInt() { String givenString = "42"; int result = Integer.decode(givenString); assertThat(result).isEqualTo(42); }

6. NumberFormatException

Tutti i metodi sopra menzionati generano un'eccezione NumberFormatException, quando si incontrano valori String imprevisti . Qui puoi vedere un esempio di una situazione del genere:

@Test(expected = NumberFormatException.class) public void givenInvalidInput_whenParsingInt_shouldThrow() { String givenString = "nan"; Integer.parseInt(givenString); }

7. Con Guava

Ovviamente, non è necessario attenersi al core Java stesso. È così che si può ottenere la stessa cosa usando Ints.tryParse () di Guava , che restituisce un valore nullo se non può analizzare l'input:

@Test public void givenString_whenTryParse_shouldConvertToInt() { String givenString = "42"; Integer result = Ints.tryParse(givenString); assertThat(result).isEqualTo(42); }

Inoltre, il metodo tryParse () accetta anche un secondo argomento radix simile a parseInt () e valueOf ().

8. Conclusione

In questo articolo, abbiamo esplorato diversi modi per convertire istanze String in istanze int o Integer .

Tutti gli esempi di codice possono, ovviamente, essere trovati su GitHub.