1. 概要

このチュートリアルでは、long値をJavaのintタイプに変換する方法を説明します。 コーディングを開始する前に、このデータ型に関する詳細を指摘する必要があります。

まず、Javaでは、longの値は符号付き64ビットの数値で表されます。 一方、 int の値は、符号付き32ビットの数値で表されます。 したがって、上位のデータ型を下位のデータ型に変換することをナローイング型キャストと呼びます。 これらの変換の結果、longの値がInteger.MAX_VALUEおよびInteger.MIN_VALUEより大きい場合、一部のビットが失われます。

さらに、変換バリアントごとに、long値がInteger.MAX_VALUEプラス1に等しい場合にどのように機能するかを示します。

2. データ変換

2.1. キャスト値

まず、Javaでの値のキャストは、型変換の最も一般的な方法です。これは簡単です。

public int longToIntCast(long number) {
    return (int) number;
}

2.2. Java 8

Java 8以降、型変換を行うためにさらに2つの方法を使用できます。Mathパッケージを使用する方法とラムダ関数を使用する方法です。 Math パッケージの場合、toIntExactメソッドを使用できます。

public int longToIntJavaWithMath(long number) {
return Math.toIntExact(number);
}

2.3. ラッパークラス

一方、ラッパークラス Long を使用して、int値を取得できます。

public int longToIntBoxingValues(long number) {
    return Long.valueOf(number).intValue();
}

2.4. BigDecimalを使用する

さらに、BigDecimalクラスを使用してこの変換を実行できます。

public static int longToIntWithBigDecimal(long number) {
    return new BigDecimal(number).intValueExact();
}

2.5. グアバの使用

次に、 GoogleGuavaIntsクラスを使用した型変換を示します。

public int longToIntGuava(long number) {
    return Ints.checkedCast(number);
}

さらに、 GoogleGuavaIntsクラスはsaturatedCastメソッドを提供します。

public int longToIntGuavaSaturated(long number) {
    return Ints.saturatedCast(number);
}

2.6. 整数の上限と下限

最後に、整数値には上限と下限があることを考慮する必要があります。 これらの制限は、Integer.MAX_VALUEおよびInteger.MIN_VALUEによって定義されます。 これらの制限を超える値の場合、結果はメソッドごとに異なります。

次のコードスニペットでは、int値がlong値を保持できない場合をテストします。

@Test
public void longToIntSafeCast() {
    long max = Integer.MAX_VALUE + 10L;
    int expected = -2147483639;
    assertEquals(expected, longToIntCast(max));
    assertEquals(expected, longToIntJavaWithLambda(max));
    assertEquals(expected, longToIntBoxingValues(max));
}

直接キャスト、ラムダ、またはボクシング値を使用すると、負の値が生成されます。 このような場合、long値は Integer.MAX_VALUE より大きいため、結果の値は負の数でラップされます。 long値がInteger.MIN_VALUEより小さい場合、結果の値は正の数になります。

一方、この記事で説明されている3つのメソッドは、さまざまなタイプの例外をスローする可能性があります。

@Test
public void longToIntIntegerException() {
    long max = Integer.MAX_VALUE + 10L;
    assertThrows(ArithmeticException.class, () -> ConvertLongToInt.longToIntWithBigDecimal(max));
    assertThrows(ArithmeticException.class, () -> ConvertLongToInt.longToIntJavaWithMath(max));
    assertThrows(IllegalArgumentException.class, () -> ConvertLongToInt.longToIntGuava(max));
}

1番目と2番目の場合、ArithmeticExceptionがスローされます。 後者の場合、IllegalArgumentExceptionがスローされます。 その場合、Ints.checkedCastは整数が範囲外かどうかをチェックします。

最後に、Guavaの saturatedCast メソッドから、最初に整数の制限を確認し、渡された数値が整数の上限と下限よりも大きいか小さいかを制限値を返します。

@Test
public void longToIntGuavaSaturated() {
    long max = Integer.MAX_VALUE + 10L;
    int expected = 2147483647;
    assertEquals(expected, ConvertLongToInt.longToIntGuavaSaturated(max));
}

3. 結論

この記事では、Javaでlongをint型に変換する方法の例をいくつか紹介しました。 ネイティブJavaキャストといくつかのライブラリを使用します。

いつものように、この記事で使用されているすべてのスニペットは、GitHubから入手できます。