回答:
Java 8で更新:
Math.toIntExact(value);
元の答え:
単純型キャストはそれを行うべきです:
long l = 100000;
int i = (int) l;
ただし、大きな数値(通常はより大きい2147483647
、小さい-2147483648
)は一部のビットを失い、正しく表現されないことに注意してください。
たとえば、2147483648
はと表され-2147483648
ます。
Long x = 100L;
int y = x.intValue();
intValue()
ここでバックグラウンドで行われていることはすべて、値をキャストすることだと思います。
long
ここではプリミティブではありません。Long
プリミティブに直接キャストできない参照型int
です。int y = (int)x;
例外をスローしますが、int y = (int)(long)x
機能します。(理由はオートボクシングです)
小さな値の場合、キャストで十分です:
long l = 42;
int i = (int) l;
ただし、a long
はより多くの情報を保持できるため、一般的なケースではint
からlong
に完全に変換することはできませんint
。がlong
以下の数を保持している場合は、Integer.MAX_VALUE
情報を失うことなくキャストして変換できます。
たとえば、次のサンプルコード:
System.out.println( "largest long is " + Long.MAX_VALUE );
System.out.println( "largest int is " + Integer.MAX_VALUE );
long x = (long)Integer.MAX_VALUE;
x++;
System.out.println("long x=" + x);
int y = (int) x;
System.out.println("int y=" + y);
私のマシンで次の出力を生成します:
largest long is 9223372036854775807
largest int is 2147483647
long x=2147483648
int y=-2147483648
マイナス記号に注意してくださいy
。x
Integer.MAX_VALUEより大きい値を保持していたため、int y
それを保持することができませんでした。この場合、負の数に折り返されます。
このケースを自分で処理したい場合は、次のようにします。
if ( x > (long)Integer.MAX_VALUE ) {
// x is too big to convert, throw an exception or something useful
}
else {
y = (int)x;
}
これはすべて正の数を想定しています。負の数の場合はMIN_VALUE
、「MAX_VALUE」の代わりに使用します
Java 8以降で使用できます:Math.toIntExact(long value)
JavaDoc:Math.toIntExactを参照してください
long引数の値を返します。値がintをオーバーフローした場合に例外をスローします。
Math.toIntExact
JDK 8のソースコード:
public static int toIntExact(long value) {
if ((int)value != value) {
throw new ArithmeticException("integer overflow");
}
return (int)value;
}
Guavaライブラリを使用している場合Ints.checkedCast(long)
、Ints.saturatedCast(long)
に変換long
する方法と方法がありint
ます。
long x = 3;
int y = (int) x;
しかし、それはをlong
として表すことができると想定していますがint
、2つの違いを知っていますか?
プリミティブのLong
代わりにラッパーを使用してlong
呼び出すことができます
Long.intValue()
これlong
は、に収まるように値を丸めるか切り捨てますint
。
Javaでは、longは符号付き64ビット数です。つまり、-9,223,372,036,854,775,808から9,223,372,036,854,775,807(両端を含む)までの数値を格納できます。
一方、intは32ビットの符号付き数値です。つまり、-2,147,483,648〜2,147,483,647(両端を含む)の数値を格納できます。
そのため、longがintで許可されている値の外にある場合、貴重な変換は行われません。
ここにプリミティブJava型のサイズの詳細:
http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
ではJavaの8私は、次のように行います
long l = 100L;
int i = Math.toIntExact(l);
このメソッドはArithmaticException
、long
値がの範囲を超えるとスローしますint
。したがって、私はデータ損失から安全です。
安全な変換を行い、ラムダ式でJava8を使用したい場合は、次のように使用できます。
val -> Optional.ofNullable(val).map(Long::intValue).orElse(null)
Function<Long,Integer> function =
ますか?
Long l = 100;
int i = Math.round(l);
Springでは、longをintに変換する厳密な方法があります
lnogがintに変換できるだけでなく、あらゆるタイプのクラスがNumberを一般的に他のNumber型に変換できます。ここでは、longをintに変換し、他の型をその逆に変換する方法を示します。
Long l = 1234567L;
int i = org.springframework.util.NumberUtils.convertNumberToTargetClass(l, Integer.class);