Câu trả lời:
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);
intValue
thay 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?
Long
sang long
đầu tiên, và sau đóint
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]
123L
để dễ đọc.
Nếu bạn quan tâm để kiểm tra tràn và có Guava tiện dụng, có Ints.checkedCast()
:
int theInt = Ints.checkedCast(theLong);
Việc triển khai rất đơn giản và ném IllegalArgumentException khi tràn:
public static int checkedCast(long value) {
int result = (int) value;
checkArgument(result == value, "Out of range: %s", value);
return result;
}
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 .
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);
}
}
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;
}
Trong Java 8 bạn có thể sử dụng toIntExact
. Nếu bạn muốn xử lý null
cá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 ArithmeticException
if nếu đối số ( long
) tràn ra một int
.
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 ...
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);
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);