Java 将长字符转换为整数

Java 将长字符转换为整数,java,Java,如何在Java中将值转换为值 Integer i = theLong != null ? theLong.intValue() : null; 或者,如果您不需要担心空值: // auto-unboxing does not go from Long to int directly, so Integer i = (int) (long) theLong; 在这两种情况下,您都可能会遇到溢出(因为Long可以存储比整数更大的范围) Java 8有一个检查溢出的助手方法(在这种情况下会出现异常

如何在Java中将值转换为值

Integer i = theLong != null ? theLong.intValue() : null;
或者,如果您不需要担心空值:

// auto-unboxing does not go from Long to int directly, so
Integer i = (int) (long) theLong;
在这两种情况下,您都可能会遇到溢出(因为Long可以存储比整数更大的范围)

Java 8有一个检查溢出的助手方法(在这种情况下会出现异常):


您需要键入并转换它

long i = 100L;
int k = (int) i;
请记住,long的范围比int大,因此可能会丢失数据

如果您正在谈论装箱类型,请阅读非空值的。

Integer intValue = myLong.intValue();

以下是三种方法:

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]
0 ldc2_w[17]
3 invokestatic java.lang.Long.valueOf(Long):java.lang.Long[19]
6阿斯托雷1[l]
//首先
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[更正]
//第二
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[带拳击]
//第三
23 aload_1[l]
//区别在于:
24 invokevirtual java.lang.Long.longValue():Long[34]
27 l2i
28 invokestatic java.lang.Integer.valueOf(int):java.lang.Integer[29]
31阿斯托尔4[糟糕]

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

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

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

如果您想检查溢出情况并准备好,有:

非常简单,并在溢出时抛出:

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

最好的简单方法是:

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;
    }
public静态int-safeLongToInt(long-longNumber)
{
if(longNumberInteger.MAX_值)
{
抛出新的IllegalArgumentException(longNumber+“不能在不更改其值的情况下转换为int”);
}
返回(int)longNumber;
}

假设非空longVal

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

例如,当你得到一个可以是整数或长整数的对象时,它就起作用了。我知道这很难看,但如果您使用的是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);

        }
}
长期访客=1000

int访客=(int)访客

在Java8中,您可以使用。如果要处理
null
值,请使用:

Integer intVal = longVal == null ? null : Math.toIntExact(longVal);
这个方法的好处是,如果参数(
long
)溢出了
int
,,它就会抛出一个异常。使用toIntExact(long value)返回长参数的值,如果值溢出了int,它就会抛出一个异常。它只适用于API级别24或更高的情况

int id = Math.toIntExact(longId);
试试这个:


Int i=Long.valueOf(L)//L:Long Value

除了@Thilo接受的答案之外,
Math.toIntExact
在可选的方法链接中也非常有效,尽管它只接受
Int
作为参数

Long coolLong = null;
Integer coolInt = Optional.ofNullable(coolLong).map(Math::toIntExact).orElse(0); //yields 0

首先,您需要检查Long是否未超过整数MaxValue。Java 8:可能重复较小的样式问题:您可能应该使用大写后缀
123L
以确保可读性。或者您可以使用良好的字体。。。我们又来了…:D(只是j/k,我也这么做)@ViacheslavDobromyslov true。问题是关于长,而不是null@SeanPatrickFloyd是的。不要忘记长变量值有时可能为空。@user64141 Java中的类型转换是一个复杂的问题。投射对象很好,因为实际上你没有改变任何东西,只是用不同的方式看同一个对象。但在本例中,您有一系列有意义的强制转换,从对象到基元,然后通过疯狂的自动装箱,再到对象,尽管语法表明它是另一个基元。对我来说,这是对拳击和原始转换的滥用。并不是所有可以做的事情都应该做。看起来比(int)(long)imo要干净得多。我使用long.valueOf(long_VARIABLE_这里)。intValue()这会缩小从long到int的原语转换范围(即可能的信息丢失,因为一些字节将被丢弃)这是最好的答案,因为它处理空值。@ViacheslavDobromyslov问题是关于长值,而不是空值。就我个人而言,我相信预先拒绝null,而不是使用null in->null out,从而通过我的应用程序传输null。因此,有人可能会说这是最糟糕的答案:-)当你可以直接调用
intValue
时,为什么要投两次?另外,它将取消x到long,强制转换到int,并重新x到
Integer
,这似乎不是很有用。我看不出我脑子里想的是什么,你有什么好的理由吗?我得到了一个错误:无法对基元类型调用intValue()long@Thilo哦,我明白了。基本上,您首先将
Long
转换为
Long
,然后再转换为
int
我想您忘记了在某个地方创建一个抽象工厂,为什么不使用上面的语句:Integer intVal=longVal!=无效的Math.toIntExact(longVal):null;通常的做法欢迎使用堆栈溢出!请注意,您正在回答一个非常古老且已回答的问题。这是一本关于旅游的指南。
int id = Math.toIntExact(longId);
Long coolLong = null;
Integer coolInt = Optional.ofNullable(coolLong).map(Math::toIntExact).orElse(0); //yields 0