Konversi Panjang menjadi Integer


Jawaban:


500
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);

5
Ini jawaban terbaik karena menangani nilai NULL.
Viacheslav Dobromyslov

3
@ViacheslavDobromyslov pertanyaannya adalah tentang nilai panjang, bukan tentang nilai nol. Dan secara pribadi saya percaya dalam menolak null di muka daripada menggunakan null in -> null out dan dengan demikian mentransport null melalui aplikasi saya. Jadi orang juga bisa berargumen ini adalah jawaban terburuk :-)
Sean Patrick Floyd

1
Mengapa Anda melemparkan dua kali ketika Anda bisa menelepon 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?
Dici

Saya mendapatkan kesalahan: Tidak dapat meminta intValue () pada tipe primitif lama
Anand

1
@ Thilo oh, saya mengerti. Pada dasarnya Anda mengonversi Longke longpertama, dan kemudian keint
mrid

123

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]

12
Masalah styliustic minor: Anda mungkin harus menggunakan akhiran huruf besar 123Lagar mudah dibaca.
Joey

Atau Anda dapat menggunakan font yang bagus ... dan kita mulai lagi ...: D (hanya j / k, saya juga melakukan itu)
davidcsb

@ViacheslavDobromyslov benar. pertanyaannya adalah tentang Long, bukan null
Sean Patrick Floyd

2
@SeanPatrickFloyd ya. Jangan lupa bahwa nilai variabel Long terkadang NULL.
Viacheslav Dobromyslov

2
@ user64141 Tipe casting di Java adalah masalah yang rumit. Casting Objects baik-baik saja, karena Anda sebenarnya tidak mengubah apa pun, hanya melihat objek yang sama dengan cara yang berbeda. Tetapi dalam kasus ini, Anda memiliki rantai gips yang bermakna, dari Object ke primitive dan kemudian, melalui kegilaan autoboxing, untuk menolak lagi, meskipun sintaksinya menyatakan itu adalah primitif lainnya. Bagi saya, ini adalah penyalahgunaan konversi tinju dan primitif. Tidak semua yang bisa dilakukan harus dilakukan.
Sean Patrick Floyd

48

Untuk nilai bukan nol:

Integer intValue = myLong.intValue();

1
Terlihat jauh lebih bersih daripada (int) (panjang) imo.
Gaʀʀʏ

Saya menggunakan Long.valueOf (LONG_VARIABLE_HERE) .intValue ()
Francis Rodrigues


8

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 .


6

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);

        }
}

5

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;
    }

4

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.


3

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 ...


2

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);

0

pengunjung panjang = 1000;

int convVisitors = (int) pengunjung;


-2

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);

15
Saya pikir Anda lupa membuat pabrik abstrak di suatu tempat
user541686
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.