«1. Обзор

В этом коротком руководстве мы покажем различные способы преобразования из строки в целое число в Groovy.

2. Преобразование с помощью as

Первый метод, который мы можем использовать для преобразования, — это ключевое слово as, которое аналогично вызову метода класса asType():

@Test
void givenString_whenUsingAsInteger_thenConvertToInteger() {
    def stringNum = "123"
    Integer expectedInteger = 123
    Integer integerNum = stringNum as Integer

    assertEquals(integerNum, expectedInteger)
}

Как и выше, мы можно использовать как int:

@Test
void givenString_whenUsingAsInt_thenConvertToInt() {
    def stringNum = "123"
    int expectedInt = 123
    int intNum = stringNum as int

    assertEquals(intNum, expectedInt)
}

3. toInteger

Другой метод из расширения Groovy JDK для java.lang.CharSequence:

@Test
void givenString_whenUsingToInteger_thenConvertToInteger() {
    def stringNum = "123"
    int expectedInt = 123
    int intNum = stringNum.toInteger()

    assertEquals(intNum, expectedInt)
}

4. Integer#parseInt

Третий способ: использовать статический метод Java Integer.parseInt():

@Test
void givenString_whenUsingParseInt_thenConvertToInteger() {
    def stringNum = "123"
    int expectedInt = 123
    int intNum = Integer.parseInt(stringNum)

    assertEquals(intNum, expectedInt)
}

5. Integer#intValue

Альтернативный метод заключается в создании нового объекта Integer и вызове его метода intValue:

@Test
void givenString_whenUsingIntValue_thenConvertToInteger() {
    def stringNum = "123"
    int expectedInt = 123
    int intNum = new Integer(stringNum).intValue()

    assertEquals(intNum, expectedInt)
}

Или, в В этом случае мы также можем использовать только новый Integer(stringNum):

@Test
void givenString_whenUsingNewInteger_thenConvertToInteger() {
    def stringNum = "123"
    int expectedInt = 123
    int intNum = new Integer(stringNum)

    assertEquals(intNum, expectedInt)
}

6. Integer#valueOf

Подобно Integer.parseInt(), мы также можем использовать статический метод Java Integer#valueOf:

@Test
void givenString_whenUsingValueOf_thenConvertToInteger() {
    def stringNum = "123"
    int expectedInt = 123
    int intNum = Integer.valueOf(stringNum)

    assertEquals(intNum, expectedInt)
}

7. DecimalFormat

И для нашего последнего метода мы можем применить класс DecimalFormat Java:

@Test
void givenString_whenUsingDecimalFormat_thenConvertToInteger() {
    def stringNum = "123"
    int expectedInt = 123
    DecimalFormat decimalFormat = new DecimalFormat("#")
    int intNum = decimalFormat.parse(stringNum).intValue()

    assertEquals(intNum, expectedInt)
}

8. Обработка исключений

Итак, если преобразование не удается, например, если есть нечисловые символы, будет выброшено исключение NumberFormatException. Кроме того, в случае, когда String имеет значение null, будет выброшено исключение NullPointerException:

@Test(expected = NumberFormatException.class)
void givenInvalidString_whenUsingAs_thenThrowNumberFormatException() {
    def invalidString = "123a"
    invalidString as Integer
}

@Test(expected = NullPointerException.class)
void givenNullString_whenUsingToInteger_thenThrowNullPointerException() {
    def invalidString = null
    invalidString.toInteger()
}

Чтобы этого не произошло, мы можем использовать метод isInteger:

@Test
void givenString_whenUsingIsInteger_thenCheckIfCorrectValue() {
    def invalidString = "123a"
    def validString = "123"
    def invalidNum = invalidString?.isInteger() ? invalidString as Integer : false
    def correctNum = validString?.isInteger() ? validString as Integer : false

    assertEquals(false, invalidNum)
    assertEquals(123, correctNum)
}

9. Резюме

В этой короткой статье , мы показали несколько эффективных способов переключения с объектов String на объекты Integer в Groovy.

Когда дело доходит до выбора наилучшего метода преобразования типа объекта, все вышеперечисленное одинаково хорошо. Самое главное — избежать ошибок, сначала проверив, может ли значение String в нашем приложении быть нечисловым, пустым или нулевым.

Как обычно, все примеры кода можно найти на GitHub.