Chuyển đổi dài thành số nguyên


Câu trả lời:


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

hoặc nếu bạn không cần phải lo lắng về null:

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

Và trong cả hai tình huống, bạn có thể gặp sự cố tràn (vì Long có thể lưu trữ phạm vi rộng hơn so với Số nguyên).

Java 8 có một phương thức trợ giúp kiểm tra lỗi tràn (bạn có một ngoại lệ trong trường hợp đó):

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

5
Đó là câu trả lời tốt nhất vì nó xử lý các giá trị NULL.
Viacheslav Dobromyslov

3
@ViacheslavDobromyslov câu hỏi là về các giá trị Dài, không phải về các giá trị null. Và cá nhân tôi tin vào việc từ chối null trước hơn là sử dụng null trong -> null out và do đó vận chuyển null qua ứng dụng của tôi. Vì vậy, người ta cũng có thể tranh luận đây là câu trả lời tồi tệ nhất :-)
Sean Patrick Floyd

1
Tại sao bạn lại chọn hai lần khi bạn chỉ có thể gọi intValuethay thế? Thêm vào đó, nó sẽ được mở hộp lâu dài, chuyển sang int và rebox thành Integer, điều này có vẻ không hữu ích lắm. Tôi không nhìn thấy điểm trên đỉnh đầu của tôi, bạn có lý do chính đáng cho việc này không?
Dici

Tôi đang gặp lỗi: Không thể gọi intValue () trên kiểu nguyên thủy dài
Anand

1
@Thilo ơi, tôi hiểu rồi. Về cơ bản, bạn đang chuyển đổi Longsang longđầu tiên, và sau đóint
mrid

123

Dưới đây là ba cách để làm điều đó:

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

Tất cả ba phiên bản tạo mã byte gần như giống hệt nhau:

 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
Vấn đề nhỏ về phong cách: Có lẽ bạn nên sử dụng hậu tố chữ hoa 123Lđể dễ đọc.
Joey

Hoặc bạn có thể sử dụng một phông chữ tốt ... và ở đây chúng tôi lại đi ...: D (chỉ cần j / k, tôi cũng làm điều đó)
davidcsb

@ViacheslavDobromyslov đúng. câu hỏi là về Long, không phải không
Sean Patrick Floyd

2
@SeanPatrickFloyd yep. Đừng quên rằng đôi khi giá trị biến dài có thể là NULL.
Viacheslav Dobromyslov

2
@ user64141 Kiểu truyền trong Java là một vấn đề phức tạp. Đúc đối tượng là tốt, bởi vì bạn thực sự không thay đổi bất cứ điều gì, chỉ nhìn vào cùng một đối tượng theo một cách khác. Nhưng trong trường hợp này, bạn có một chuỗi các diễn viên có ý nghĩa, từ Object đến nguyên thủy và sau đó, thông qua sự điên rồ của autoboxing, để phản đối một lần nữa, mặc dù cú pháp cho thấy đó là một nguyên thủy khác. Đối với tôi, đây là một sự lạm dụng của cả quyền anh và chuyển đổi nguyên thủy. Không phải tất cả mọi thứ có thể được thực hiện nên được thực hiện.
Sean Patrick Floyd

48

Đối với các giá trị khác null:

Integer intValue = myLong.intValue();

1
Trông sạch hơn nhiều so với (int) (dài) imo.
Gaʀʀʏ

Tôi sử dụng Long.valueOf (LONG_VARIABLE_HERE) .intValue ()
Francis


8

Bạn sẽ cần phải gõ nó.

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

Hãy nhớ rằng một cái dài có phạm vi lớn hơn int nên bạn có thể mất dữ liệu.

Nếu bạn đang nói về các loại đóng hộp, sau đó đọc tài liệu .


6

Nếu bạn đang sử dụng Java 8, hãy làm như dưới đây

    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

Cách đơn giản nhất để làm như vậy là:

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

Trong Java 8 bạn có thể sử dụng toIntExact. Nếu bạn muốn xử lý nullcác giá trị, sử dụng:

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

Điều tốt về phương thức này là nó ném một ArithmeticExceptionif nếu đối số ( long) tràn ra một int.


3

Giả sử không null longVal

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

Nó hoạt động ví dụ y bạn nhận được một Object có thể là Integer hoặc Long. Tôi biết điều đó thật xấu xí, nhưng nó xảy ra ...


2

Sử dụng toIntExact (giá trị dài) trả về giá trị của đối số dài, ném ngoại lệ nếu giá trị vượt quá int. nó sẽ chỉ hoạt động API cấp 24 trở lên.

int id = Math.toIntExact(longId);

0

khách truy cập dài = 1000;

int confVisitor = (int) khách truy cập;


-2

Trong java, có một cách nghiêm ngặt để chuyển đổi dài sang int

Không chỉ lnog có thể chuyển đổi thành int, bất kỳ loại lớp mở rộng nào Số đều có thể chuyển đổi sang loại Số khác nói chung, ở đây tôi sẽ chỉ cho bạn cách chuyển đổi dài sang int, ngược lại.

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

15
Tôi nghĩ bạn đã quên tạo một nhà máy trừu tượng ở đâu đó
user541686
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.