Jawaban:
Integer i = theLong != null ? theLong.intValue() : null;
atau jika Anda tidak perlu khawatir tentang nol:
// auto-unboxing does not go from Long to int directly, so
Integer i = (int) (long) theLong;
Dan dalam kedua situasi, Anda mungkin mengalami overflow (karena Long dapat menyimpan rentang yang lebih luas daripada Integer).
Java 8 memiliki metode pembantu yang memeriksa luapan (Anda mendapatkan pengecualian dalam kasus itu):
Integer i = theLong == null ? null : Math.toIntExact(theLong);
intValuesaja? Plus itu akan unbox ke long, cast ke int, dan rebox to Integer, yang sepertinya tidak terlalu berguna. Saya tidak melihat poin di atas kepala saya, apakah Anda punya alasan bagus untuk ini?
Longke longpertama, dan kemudian keint
Berikut adalah tiga cara untuk melakukannya:
Long l = 123L;
Integer correctButComplicated = Integer.valueOf(l.intValue());
Integer withBoxing = l.intValue();
Integer terrible = (int) (long) l;
Ketiga versi menghasilkan kode byte yang hampir identik:
0 ldc2_w <Long 123> [17]
3 invokestatic java.lang.Long.valueOf(long) : java.lang.Long [19]
6 astore_1 [l]
// first
7 aload_1 [l]
8 invokevirtual java.lang.Long.intValue() : int [25]
11 invokestatic java.lang.Integer.valueOf(int) : java.lang.Integer [29]
14 astore_2 [correctButComplicated]
// second
15 aload_1 [l]
16 invokevirtual java.lang.Long.intValue() : int [25]
19 invokestatic java.lang.Integer.valueOf(int) : java.lang.Integer [29]
22 astore_3 [withBoxing]
// third
23 aload_1 [l]
// here's the difference:
24 invokevirtual java.lang.Long.longValue() : long [34]
27 l2i
28 invokestatic java.lang.Integer.valueOf(int) : java.lang.Integer [29]
31 astore 4 [terrible]
123Lagar mudah dibaca.
Untuk nilai bukan nol:
Integer intValue = myLong.intValue();
Jika Anda ingin memeriksa luapan dan memiliki jambu berguna, ada Ints.checkedCast():
int theInt = Ints.checkedCast(theLong);
Implementasinya sangat sederhana, dan melempar IllegalArgumentException pada overflow:
public static int checkedCast(long value) {
int result = (int) value;
checkArgument(result == value, "Out of range: %s", value);
return result;
}
Anda harus mengetikkan melemparkannya.
long i = 100L;
int k = (int) i;
Ingatlah bahwa panjang memiliki rentang lebih besar dari int sehingga Anda mungkin kehilangan data.
Jika Anda berbicara tentang tipe kotak, maka baca dokumentasinya .
Jika Anda menggunakan Java 8 Lakukan seperti di bawah ini
import static java.lang.Math.toIntExact;
public class DateFormatSampleCode {
public static void main(String[] args) {
long longValue = 1223321L;
int longTointValue = toIntExact(longValue);
System.out.println(longTointValue);
}
}
Cara sederhana terbaik untuk melakukannya adalah:
public static int safeLongToInt( long longNumber )
{
if ( longNumber < Integer.MIN_VALUE || longNumber > Integer.MAX_VALUE )
{
throw new IllegalArgumentException( longNumber + " cannot be cast to int without changing its value." );
}
return (int) longNumber;
}
Di Java 8 Anda bisa menggunakan toIntExact. Jika Anda ingin menangani nullnilai, gunakan:
Integer intVal = longVal == null ? null : Math.toIntExact(longVal);
Hal yang baik tentang metode ini adalah ia melempar ArithmeticExceptionjika argumen ( long) meluap int.
Dengan asumsi tidak null longVal
Integer intVal = ((Number)longVal).intValue();
Ini berfungsi misalnya y Anda mendapatkan Obyek yang bisa berupa Integer atau Panjang. Saya tahu itu jelek, tapi itu terjadi ...
Menggunakan toIntExact (nilai panjang) mengembalikan nilai argumen panjang, melempar pengecualian jika nilai melebihi int. itu hanya akan berfungsi API level 24 atau lebih tinggi.
int id = Math.toIntExact(longId);
Di java, ada cara yang ketat untuk mengkonversi panjang ke int
tidak hanya lnog yang dapat dikonversi menjadi int, semua tipe kelas extends Number dapat dikonversi ke tipe Number lainnya secara umum, di sini saya akan menunjukkan kepada Anda bagaimana mengkonversi panjang ke int, tipe lain sebaliknya.
Long l = 1234567L;
int i = org.springframework.util.NumberUtils.convertNumberToTargetClass(l, Integer.class);