แปลง Long เป็น Integer


308

วิธีการแปลงLongค่าเป็นIntegerค่าใน Java?


13
ก่อนอื่นคุณต้องตรวจสอบว่าคุณยาวไม่เกินจำนวนเต็ม MaxValue
Lukasz


คำตอบ:


500
Integer i = theLong != null ? theLong.intValue() : null;

หรือถ้าคุณไม่จำเป็นต้องกังวลเกี่ยวกับ null:

// auto-unboxing does not go from Long to int directly, so
Integer i = (int) (long) theLong;

และในทั้งสองสถานการณ์คุณอาจพบล้น (เนื่องจาก Long สามารถเก็บช่วงกว้างกว่าจำนวนเต็ม)

Java 8 มีเมธอดตัวช่วยที่ตรวจสอบโอเวอร์โฟลว์ (คุณได้รับข้อยกเว้นในกรณีนั้น):

Integer i = theLong == null ? null : Math.toIntExact(theLong);

5
มันเป็นคำตอบที่ดีที่สุดเพราะรองรับค่า NULL
Viacheslav Dobromyslov

3
@ViacheslavDobromyslov คำถามคือเกี่ยวกับค่า Long ไม่ใช่ค่า Null และโดยส่วนตัวฉันเชื่อในการปฏิเสธโมฆะล่วงหน้าแทนที่จะใช้ null ใน -> null ออกดังนั้นการขนส่ง null ผ่านแอปพลิเคชันของฉัน ดังนั้นเราอาจโต้แย้งได้ว่านี่คือคำตอบที่แย่ที่สุด :-)
ฌอนแพทริคฟลอยด์

1
ทำไมคุณต้องส่งสองครั้งเมื่อคุณสามารถโทรหาได้intValueแทน? นอกจากนี้มันจะทำการ unbox ไปเป็นระยะเวลานาน, ส่งไปยัง int, และ rebox ไปIntegerที่ซึ่งดูเหมือนจะไม่มีประโยชน์มาก ฉันไม่เห็นจุดที่อยู่บนหัวของฉันคุณมีเหตุผลที่ดีสำหรับเรื่องนี้หรือไม่?
Dici

ฉันได้รับข้อผิดพลาด: ไม่สามารถเรียกใช้ intValue () กับประเภทดั้งเดิมแบบยาว
Anand

1
@Thilo โอ้ฉันเข้าใจแล้ว โดยทั่วไปคุณจะแปลงLongเป็นlongก่อนแล้วจึงไปint
mrid

123

นี่คือสามวิธีในการทำ:

Long l = 123L;
Integer correctButComplicated = Integer.valueOf(l.intValue());
Integer withBoxing = l.intValue();
Integer terrible = (int) (long) l;

ทั้งสามเวอร์ชันสร้างโค้ดไบต์ที่เกือบเหมือนกัน:

 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
ปัญหา styliustic เล็กน้อย: คุณควรใช้คำต่อท้ายเป็นตัวพิมพ์ใหญ่123Lเพื่อให้อ่านง่าย
Joey

หรือคุณสามารถใช้ตัวอักษรที่ดี ... และที่นี่เราไปอีกครั้ง ... : D (เพียง J / K, ฉันยังทำอย่างนั้น)
davidcsb

@ViacheslavDobromyslov จริง คำถามนี้เกี่ยวกับ Long ไม่ใช่ null
Sean Patrick Floyd

2
@SeanPatrickFloyd ใช่แล้ว อย่าลืมว่าค่าตัวแปร Long อาจเป็น NULL ในบางครั้ง
Viacheslav Dobromyslov

2
@ user64141 การคัดเลือกประเภทใน Java เป็นปัญหาที่ซับซ้อน การคัดเลือกนักแสดงนั้นดีเพราะคุณไม่ได้เปลี่ยนแปลงอะไรเลยเพียงแค่มองวัตถุเดียวกันในวิธีที่ต่างออกไป แต่ในกรณีนี้คุณมีสายโซ่ของการปลดเปลื้องที่มีความหมายตั้งแต่ Object ถึงดั้งเดิมและจากนั้นด้วยความบ้าบอของการ autoboxing ถึงการคัดค้านอีกครั้งแม้ว่า syntax จะแนะนำมันเป็นแบบดั้งเดิม สำหรับฉันนี่คือการใช้ทั้งการชกมวยและการแปลงแบบดั้งเดิม ไม่ใช่ทุกสิ่งที่สามารถทำได้
ฌอนแพทริคฟลอยด์


20

หากคุณต้องการตรวจสอบโอเวอร์โฟลว์และใช้ประโยชน์ฝรั่งได้นั่นคือInts.checkedCast():

int theInt = Ints.checkedCast(theLong);

การติดตั้งนั้นง่ายมากและIllegalArgumentException จะไหลล้น:

public static int checkedCast(long value) {
  int result = (int) value;
  checkArgument(result == value, "Out of range: %s", value);
  return result;
}

8

คุณจะต้องพิมพ์แบบโยน

long i = 100L;
int k = (int) i;

โปรดทราบว่าระยะยาวมีขนาดใหญ่กว่า int ดังนั้นคุณอาจสูญเสียข้อมูล

หากจะพูดถึงเกี่ยวกับประเภทชนิดบรรจุกล่องแล้วอ่านเอกสาร


6

หากคุณใช้ Java 8 ให้ทำดังต่อไปนี้

    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

วิธีที่ง่ายที่สุดในการทำเช่นนี้คือ:

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

ใน Java 8 toIntExactคุณสามารถใช้ หากคุณต้องการจัดการnullค่าใช้:

Integer intVal = longVal == null ? null : Math.toIntExact(longVal);

สิ่งที่ดีเกี่ยวกับวิธีนี้ก็คือมันจะArithmeticExceptionส่งข้อโต้แย้งถ้า ( long) ล้นintและ


3

สมมติว่าไม่ใช่ nullVal

Integer intVal = ((Number)longVal).intValue();

มันทำงานได้ตัวอย่างเช่นคุณได้รับวัตถุที่สามารถเป็นจำนวนเต็มหรือยาว ฉันรู้ว่ามันน่าเกลียด แต่มันเกิดขึ้น ...


2

การใช้ toIntExact (ค่ายาว) ส่งคืนค่าของอาร์กิวเมนต์ที่ยาวโดยมีข้อยกเว้นหากค่ามีค่ามากเกินไป มันจะใช้งานได้เฉพาะ API ระดับ 24 ขึ้นไป

int id = Math.toIntExact(longId);


-2

ในจาวามีวิธีการแปลงยาวเป็น int อย่างเข้มงวด

ไม่เพียง แต่ lnog สามารถแปลงเป็น int ได้คลาสชนิดใดก็ได้ที่ Number สามารถแปลงเป็น Number อื่น ๆ ได้โดยทั่วไปที่นี่ฉันจะแสดงให้คุณเห็นวิธีการแปลง long เป็น int เป็นประเภทอื่น ๆ ในทางกลับกัน

Long l = 1234567L;
int i = org.springframework.util.NumberUtils.convertNumberToTargetClass(l, Integer.class);

15
ฉันคิดว่าคุณลืมที่จะสร้างโรงงานนามธรรมบางแห่ง
541686
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.