Yanıtlar:
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);
intValue
Bunun 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ı?
Long
için long
ilk ve daha sonraint
İş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]
123L
Okunabilirlik için büyük olasılıkla büyük harf soneki kullanmalısınız .
Boş olmayan değerler için:
Integer intValue = myLong.intValue();
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;
}
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 .
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);
}
}
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;
}
Java 8'de şunları kullanabilirsiniz: toIntExact
. null
Değerleri işlemek istiyorsanız , şunu kullanın:
Integer intVal = longVal == null ? null : Math.toIntExact(longVal);
Bu yöntemle ilgili iyi bir şey, ArithmeticException
if argümanının ( long
) bir int
.
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 ...
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);
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);