1. введение
Преобразование String в int или Integer – очень распространенная операция в Java. В этой статье мы покажем несколько способов решения этой проблемы.
Есть несколько простых способов справиться с этим базовым преобразованием.
2. Integer.parseInt()
Одним из основных решений является использование Integer выделенного статического метода: parseInt() , который возвращает примитивное int значение :
@Test public void givenString_whenParsingInt_shouldConvertToInt() { String givenString = "42"; int result = Integer.parseInt(givenString); assertThat(result).isEqualTo(42); }
По умолчанию метод parseInt() предполагает, что заданная строка является целым числом base-10. Кроме того, этот метод принимает еще один аргумент для изменения этого значения по умолчанию radix. Например, мы можем разобрать двоичную строку s следующим образом:
@Test public void givenBinaryString_whenParsingInt_shouldConvertToInt() { String givenString = "101010"; int result = Integer.parseInt(givenString, 2); assertThat(result).isEqualTo(42); }
Естественно, этот метод также можно использовать с любым другим радиксом, таким как 16 (шестнадцатеричный) или 8 (восьмеричный).
3. Integer.valueOf()
Другим вариантом было бы использовать статический Integer.valueOf() метод, который возвращает Integer экземпляр :
@Test public void givenString_whenCallingIntegerValueOf_shouldConvertToInt() { String givenString = "42"; Integer result = Integer.valueOf(givenString); assertThat(result).isEqualTo(new Integer(42)); }
Аналогично, метод valueOf() также принимает пользовательский radix в качестве второго аргумента:
@Test public void givenBinaryString_whenCallingIntegerValueOf_shouldConvertToInt() { String givenString = "101010"; Integer result = Integer.valueOf(givenString, 2); assertThat(result).isEqualTo(new Integer(42)); }
3.1. Целочисленный кэш
На первый взгляд может показаться, что значение методов() и parseInt() совершенно одинаковы. По большей части это верно — даже метод valueOf() делегирует метод parseInt внутренне.
Однако есть одно тонкое различие между этими двумя методами: метод valueOf() использует целочисленный кэш внутри . Этот кэш будет возвращать один и тот же Целочисленный экземпляр для чисел от -128 до 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); } }
Поэтому настоятельно рекомендуется использовать valueOf() вместо parseInt() для извлечения коробочных целых чисел, так как это может привести к улучшению общего объема нашего приложения.
4. Конструктор целых чисел
Вы также можете использовать конструктор Integer :
@Test public void givenString_whenCallingIntegerConstructor_shouldConvertToInt() { String givenString = "42"; Integer result = new Integer(givenString); assertThat(result).isEqualTo(new Integer(42)); }
Начиная с Java 9, этот конструктор был устарел в пользу других статических заводских методов, таких как value Of() или parseInt() . Даже до этого устаревания было редко уместно использовать этот конструктор. Мы должны использовать parseInt() для преобразования строки в примитив int или использовать valueOf() для преобразования ее в объект Integer .
5. Целое число.декодирование()
Кроме того, Integer.decode() работает аналогично Integer.value(), но также может принимать различные числовые представления :
@Test public void givenString_whenCallingIntegerDecode_shouldConvertToInt() { String givenString = "42"; int result = Integer.decode(givenString); assertThat(result).isEqualTo(42); }
6. Исключение NumberFormatException
Все упомянутые выше методы выбрасывают исключение NumberFormatException, при обнаружении неожиданных String значений. Здесь вы можете увидеть пример такой ситуации:
@Test(expected = NumberFormatException.class) public void givenInvalidInput_whenParsingInt_shouldThrow() { String givenString = "nan"; Integer.parseInt(givenString); }
7. С Гуавой
Конечно, нам не нужно придерживаться самого ядра Java. Вот как то же самое можно сделать с помощью Guava Ints.TryParse(), который возвращает null значение, если он не может разобрать входные данные:
@Test public void givenString_whenTryParse_shouldConvertToInt() { String givenString = "42"; Integer result = Ints.tryParse(givenString); assertThat(result).isEqualTo(42); }
Кроме того, метод TryParse() также принимает второй аргумент radix , аналогичный parseInt() и valueOf().
8. Заключение
В этой статье мы рассмотрели несколько способов преобразования экземпляров String в экземпляры int или Integer .
Все примеры кода, конечно, можно найти на GitHub .