Long'u Tamsayıya Dönüştür


Yanıtlar:


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

veya null hakkında endişelenmenize gerek yoksa:

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

Ve her iki durumda da, taşmalarla karşılaşabilirsiniz (çünkü Long, bir Tamsayıdan daha geniş bir aralığı depolayabilir).

Java 8'in taşmayı kontrol eden bir yardımcı yöntemi vardır (bu durumda bir istisna alırsınız):

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

5
Bu en iyi yanıt çünkü NULL değerleri işliyor.
Viacheslav Dobromyslov

3
@ViacheslavDobromyslov soru null değerler ile değil, Long değerleri ile ilgiliydi. Ve şahsen ben null in -> null out kullanmak yerine null ön reddetmek ve böylece benim uygulama aracılığıyla null taşımak inanıyorum. Biri de bunun en kötü cevap olduğunu iddia edebilir :-)
Sean Patrick Floyd

1
intValueBunun yerine sadece arayabildiğinizde neden iki kez yayınladınız? Ayrıca çok uzun sürmeyecek, int'e dökülecek ve yeniden kutlanacak Integer, ki bu çok yararlı görünmüyor. Başımın üstündeki noktayı görmüyorum, bunun için iyi bir sebebin var mı?
Dici

Ben hata alıyorum: ilkel tip uzun intValue () çağıramıyor
Anand

1
@Thilo oh, anladım. Temelde dönüştürme konum Longiçin longilk ve daha sonraint
mrid

123

İşte bunu yapmanın üç yolu:

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

Her üç sürüm de neredeyse aynı bayt kodunu üretir:

 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
Küçük yapışkanlık sorunu: 123LOkunabilirlik için büyük olasılıkla büyük harf soneki kullanmalısınız .
Joey

Veya iyi bir yazı tipi kullanabilirsiniz ... ve tekrar başlıyoruz ...: D (sadece j / k, bunu da yaparım)
davidcsb

@ViacheslavDobromyslov true. soru uzun değil, null hakkındaydı
Sean Patrick Floyd

2
@SeanPatrickFloyd yep. Uzun değişken değerinin bazen NULL olabileceğini unutmayın.
Viacheslav Dobromyslov

2
@ user64141 Java'da tür dökümü karmaşık bir konudur. Nesneleri yayınlamak iyidir, çünkü aslında hiçbir şeyi değiştirmezsiniz, sadece aynı nesneye farklı bir şekilde bakarsınız. Ancak bu durumda, sözdizimi başka bir ilkel olduğunu ileri sürse de, Nesneden ilkel ve daha sonra otomatik boks çılgınlığı yoluyla tekrar nesneye anlamlı bir döküm zincirine sahipsiniz. Bana göre, bu hem boksun hem de ilkel dönüşümün yanlış kullanımı. Yapılacak her şey yapılmamalıdır.
Sean Patrick Floyd

48

Boş olmayan değerler için:

Integer intValue = myLong.intValue();

1
(İnt) (uzun) imo'dan çok daha temiz görünüyor.
Gaʀʀʏ

Long.valueOf (LONG_VARIABLE_HERE) .intValue () kullanıyorum
Francis Rodrigues

20

Eğer taşmaların olup ve olması önem veriyorsanız Guava kullanışlı vardır Ints.checkedCast():

int theInt = Ints.checkedCast(theLong);

Uygulama ölü basittir ve atar IllegalArgumentException taşma tarih:

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

8

Döküm yazmanız gerekir.

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

Uzun süre bir int daha büyük bir menzile sahip olduğunu unutmayın, böylece veri kaybedebilirsiniz.

Kutulu türler hakkında konuşuyorsanız, belgeleri okuyun .


6

Java 8 kullanıyorsanız aşağıdaki gibi yapın

    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

Bunu yapmanın en basit yolu:

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

4

Java 8'de şunları kullanabilirsiniz: toIntExact . nullDeğerleri işlemek istiyorsanız , şunu kullanın:

Integer intVal = longVal == null ? null : Math.toIntExact(longVal);

Bu yöntemle ilgili iyi bir şey, ArithmeticExceptionif argümanının ( long) bir int.


3

Null uzun değil varsayma

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

Örneğin y tamsayı veya uzun olabilen bir nesne alırsınız. Bunun çirkin olduğunu biliyorum, ama oluyor ...


2

ToIntExact (long value) kullanılması, uzun bağımsız değişkenin değerini döndürür ve değer bir int'den taşarsa bir istisna atar. yalnızca API düzey 24 veya üstü çalışır.

int id = Math.toIntExact(longId);

0

uzun ziyaretçi = 1000;

int convVisitors = (int) ziyaretçi;


-2

Java, uzun bir int dönüştürmek için titiz bir yolu var

sadece lnog int dönüştürebilirsiniz, herhangi bir sınıf türü genişletir Sayı genel olarak diğer Sayı türüne dönüştürebilirsiniz, burada size nasıl int uzun, diğer tip tersi dönüştürmek gösterecektir.

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

15
Sanırım bir yerde soyut bir fabrika yaratmayı unuttun
user541686
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.