2011-04-27 216 views

回答

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

,或者如果你不需要担心空:

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

而在这两种情况下,你可能会遇到溢出(因为龙可以存储更广泛的比整数)。

+4

这是最好的答案,因为它处理NULL值。 – 2014-04-06 01:05:43

+1

@ViacheslavDobromyslov问题是关于Long值,而不是空值。而且我个人认为先拒绝null,而不是在null中使用null,从而在我的应用程序中传输null。所以有人可能会认为这是最糟糕的答案:-) – 2015-06-11 15:46:08

+1

为什么当你只需调用'intValue'而不是两次?此外,它将取消长框,转换为int,并将rebox重新设置为“Integer”,这看起来不是很有用。我没有看到我头顶上的重点,你有这个好理由吗? – Dici 2016-07-14 00:09:03

5

你需要输入它。

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

请记住,长整数的范围比整数大,因此可能会丢失数据。

如果您正在谈论盒装类型,请阅读documentation

40
Integer intValue = myLong.intValue(); 
+0

看起来比(int) (很长)imo。 – 2013-12-10 20:41:32

+2

它不适用于NULL值 – 2014-03-08 08:35:20

+0

@ViacheslavDobromyslov是的,你是对的。这很明显 – birdy 2014-04-04 08:56:16

106

这里有三种方法可以做到这一点:

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] 
+10

小问题:您应该使用大写后缀'123L'来提高可读性。 – Joey 2012-07-12 12:48:49

+0

或者你可以使用一个很好的字体......然后我们再次去......:D(只是j/k,我也是这么做的) – davidcesarino 2013-03-31 22:22:22

+3

它不适用于NULL值 – 2014-03-08 08:35:02

-3

在java中,有转换很长的一个严格的方法to int

不仅lnog可以转换为int,任何类型的类都可以扩展Number可以转换为其他Numbe一般来说,在这里我会告诉你如何将long转换为int,反之亦然。

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

过于复杂! – genobis 2013-04-05 13:38:50

+10

我想你忘了在某处创建一个抽象工厂 – Mehrdad 2014-06-27 09:37:37

18

如果你关心检查溢出,并有Guava得心应手,有Ints.checkedCast()

int theInt = Ints.checkedCast(theLong); 

The implementation是死的简单,和溢出抛出IllegalArgumentException

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

最好简单的做法是:

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

假设不为空longVal

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

y您得到一个对象,可以是整数或长时间工作的例子。我知道这是丑陋的,但它发生......

4

如果您使用的是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); 

     } 
} 
0

长参观者= 1000;

int convVisitors =(int)visitor;