1. 序章

StringintまたはIntegerに変換することは、Javaでは非常に一般的な操作です。 この記事では、この問題に対処するための複数の方法を紹介します。

この基本的な変換に取り組む簡単な方法がいくつかあります。

2. Integer.parseInt()

主な解決策の1つは、整数の専用静的メソッドparseInt()を使用することです。これは、プリミティブint値を返します。

@Test
public void givenString_whenParsingInt_shouldConvertToInt() {
    String givenString = "42";

    int result = Integer.parseInt(givenString);

    assertThat(result).isEqualTo(42);
}

デフォルトでは、 parseInt()メソッドは、指定されたStringが10進数の整数であると想定しています。 さらに、このメソッドは、このデフォルトを変更するための別の引数を受け入れます基数。 たとえば、次のようにバイナリ文字列を解析できます。

@Test
public void givenBinaryString_whenParsingInt_shouldConvertToInt() {
    String givenString = "101010";

    int result = Integer.parseInt(givenString, 2);

    assertThat(result).isEqualTo(42);
}

もちろん、この方法を16(16進数)や8(8進数)などの他の基数で使用することもできます。

3. Integer.valueOf()

別のオプションは、静的なInteger.valueOf()メソッドを使用することです。これは、整数インスタンスを返します。

@Test
public void givenString_whenCallingIntegerValueOf_shouldConvertToInt() {
    String givenString = "42";

    Integer result = Integer.valueOf(givenString);

    assertThat(result).isEqualTo(new Integer(42));
}

同様に、 valueOf()メソッドも、2番目の引数としてカスタム基数を受け入れます。

@Test
public void givenBinaryString_whenCallingIntegerValueOf_shouldConvertToInt() {
    String givenString = "101010";

    Integer result = Integer.valueOf(givenString, 2);

    assertThat(result).isEqualTo(new Integer(42));
}

3.1. 整数キャッシュ

一見すると、 valueOf()メソッドと parseInt()メソッドはまったく同じように見えるかもしれません。 ほとんどの場合、これは当てはまります— valueOf()メソッドでさえ、内部でparseIntメソッドに委任します。

ただし、これら2つのメソッドには微妙な違いが1つあります。 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);
    }
}

したがって、 parseInt()の代わりに valueOf()を使用してボックス化された整数を抽出することを強くお勧めします。これにより、アプリケーションの全体的なフットプリントが向上する可能性があります。

4. 整数のコンストラクタ

Integerのコンストラクターを使用することもできます。

@Test
public void givenString_whenCallingIntegerConstructor_shouldConvertToInt() {
    String givenString = "42";

    Integer result = new Integer(givenString);

    assertThat(result).isEqualTo(new Integer(42));
}

Java 9以降、このコンストラクターは非推奨になり valueOf() parseInt()などの他の静的ファクトリメソッドが採用されました。 この廃止の前でさえ、それはこのコンストラクターを使用するのが適切なことはめったにありません。 parseInt()を使用して文字列をintプリミティブに変換するか、valueOf()を使用してそれをIntegerオブジェクトに変換する必要があります。

5. Integer.decode()

また、 Integer.decode() Integer.valueOf()、と同様に機能しますが、異なる数値表現を受け入れることもできます。

@Test
public void givenString_whenCallingIntegerDecode_shouldConvertToInt() {
    String givenString = "42";

    int result = Integer.decode(givenString);

    assertThat(result).isEqualTo(42);
}

6. NumberFormatException

上記のすべてのメソッドは、予期しない String 値に遭遇すると、 NumberFormatException、をスローします。 ここでは、そのような状況の例を見ることができます。

@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()メソッドは、 parseInt()および valueOf()。と同様の2番目の基数引数も受け入れます。

8. 結論

この記事では、StringインスタンスをintまたはIntegerインスタンスに変換する複数の方法について説明しました。

もちろん、すべてのコード例はGitHubにあります。