LongをIntegerに変換する


回答:


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問題は、null値ではなく、Long値に関するものでした。そして個人的には、null in-> null outを使用するのではなく、前もってnullを拒否し、それによってアプリケーションを通じてnullを転送すると信じています。したがって、これが最悪の答えであると主張することもできます:-)
ショーンパトリックフロイド

1
intValue代わりに呼び出すことができるのに、なぜ2回キャストするのですか?それに加えて、unboxからlongにキャストし、intにキャストし、reboxからに移動しますが、Integerあまり便利ではないようです。頭の上のポイントがわかりません。これには正当な理由がありますか?
Dici 2016

エラーが発生します:プリミティブ型longでintValue()を呼び出せません
Anand

1
@Thiloああ、わかりました。基本的にLonglong最初に変換し、次に変換しますint
mrid

123

これを行うには、次の3つの方法があります。

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

3つのバージョンすべてがほぼ同じバイトコードを生成します。

 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読みやすくするために、大文字のサフィックスを使用する必要があります。
Joey

または、適切なフォントを使用できます...そして、ここでもう一度行きます...:D(ちょうどj / k、私もそれを行います)
davidcsb

@ViacheslavDobromyslov真実。問題は、nullではなくLongに関するものでした
Sean Patrick Floyd

2
@SeanPatrickFloydうん。Long変数の値がNULLになる場合があることを忘れないでください。
Viacheslav Dobromyslov 2014年

2
@ user64141 Javaでの型キャストは複雑な問題です。実際には何も変更せず、同じオブジェクトを別の方法で見ているだけなので、オブジェクトのキャストは問題ありません。しかし、この場合、構文が別のプリミティブであることを示唆しているにもかかわらず、オブジェクトからプリミティブに、そしてオートボクシングの狂気を通して再びオブジェクトに、意味のあるキャストのチェーンがあります。私にとって、これはボクシングとプリミティブ変換の両方の誤用です。できることすべてを行うべきではありません。
Sean Patrick Floyd

48

null以外の値の場合:

Integer intValue = myLong.intValue();

1
(int)(long)imoよりもずっときれいに見えます。
Gaʀʀʏ

私はLong.valueOf(LONG_VARIABLE_HERE).intValue()を使用します
Francis Rodrigues


8

型キャストする必要があります。

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

longはintよりも範囲が広いため、データを失う可能性があることに注意してください。

ボックス型について話している場合は、ドキュメントを読んでください。


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();

たとえば、整数または長整数のオブジェクトを取得すると機能します。私はそれが醜いことを知っていますが、それは起こります...


2

toIntExact(long value)を使用すると、long引数の値が返され、値がintをオーバーフローすると例外がスローされます。APIレベル24以上でのみ機能します。

int id = Math.toIntExact(longId);


-2

Javaでは、longをintに変換する厳密な方法があります

lnogがintに変換できるだけでなく、あらゆるタイプのクラスがNumberを一般的に他のNumber型に変換できます。ここでは、longをintに変換し、他の型をその逆に変換する方法を示します。

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

15
どこかに抽象的なファクトリを作成するのを忘れたようです
user541686
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.