将Long转换为Integer


Answers:


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可以比Integer存储更大的范围)。

Java 8有一个辅助方法来检查溢出(在这种情况下,您会得到一个异常):

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

5
这是最好的答案,因为它处理NULL值。
Viacheslav Dobromyslov 2014年

3
@ViacheslavDobromyslov问题是关于Long值,而不是null值。而且我个人认为应该先拒绝null,而不要使用null in-> null out,从而通过我的应用程序传输null。因此,有人可能会说这是最糟糕的答案:-)
肖恩·帕特里克·弗洛伊德

1
为什么只打个电话就投两次intValue?另外,它会取消装箱到很长的时间,转换为int,然后重新装箱到Integer,这似乎没有什么用。我看不到要点,您有充分的理由吗?
Dici 2016年

我收到错误消息:无法对long类型的原始类型调用intValue()
Anand

1
@Thilo哦,明白了。基本上,您首先要转换,然后转换Longlongint
凌晨

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
文体上的次要问题:您可能应该使用大写后缀123L以提高可读性。
乔伊

或者,您可以使用一种好的字体...然后我们再来...:D(只是j / k,我也可以这样做)
davidcsb 2013年

@ViacheslavDobromyslov正确。问题是关于长而不是空
肖恩·帕特里克·弗洛伊德

2
@SeanPatrickFloyd是的。不要忘记,有时Long变量的值可能为NULL。
Viacheslav Dobromyslov 2014年

2
@ user64141 Java中的类型转换是一个复杂的问题。投射对象很好,因为您实际上并没有改变任何东西,只是以不同的方式查看相同的对象。但是,在这种情况下,从语法到对象,然后通过自动装箱的疯狂,您将拥有一系列有意义的转换,即使语法表明它是另一种原始也是如此。对我来说,这是对拳击和原始转换的滥用。并非所有可以做的事情都应该做。
肖恩·帕特里克·弗洛伊德



8

您需要输入类型转换。

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

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

如果您要谈论盒装类型,请阅读文档


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


3

假设不为null longVal

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

例如,当您获得一个可以是Integer或Long的Object时,它将起作用。我知道这很丑,但是确实发生了...


2

使用toIntExact(long value)返回long参数的值,如果该值溢出int则抛出异常。它仅适用于API级别24或更高。

int id = Math.toIntExact(longId);

0

长访客= 1000;

int convVisitors =(int)visitors;


-2

在Java中,有一种严格的方法可以将long转换为int

不仅lnog可以将int转换为int,任何类型的扩展Number都可以将其转换为其他Number类型,通常,这里我将向您展示如何将long转换为int,反之亦然。

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

15
我认为您忘记在某个地方创建抽象工厂了
user541686 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.