উত্তর:
Integer i = theLong != null ? theLong.intValue() : null;
বা যদি আপনার নাল সম্পর্কে চিন্তা করার দরকার না হয়:
// auto-unboxing does not go from Long to int directly, so
Integer i = (int) (long) theLong;
এবং উভয় পরিস্থিতিতেই আপনি ওভারফ্লোতে প্রবাহিত হতে পারেন (কারণ একটি দীর্ঘকাল একটি পূর্ণসংখ্যার চেয়ে বৃহত্তর পরিসর সঞ্চয় করতে পারে)।
জাভা 8 এর একটি সহায়ক পদ্ধতি রয়েছে যা ওভারফ্লো পরীক্ষা করে (আপনি সেই ক্ষেত্রে একটি ব্যতিক্রম পেয়েছেন):
Integer i = theLong == null ? null : Math.toIntExact(theLong);
intValueপরিবর্তে কল করতে পারলে আপনি কেন দুবার নিক্ষেপ করবেন ? প্লাস এটি আনবক্সে দীর্ঘ, কাস্ট টু ইনট এবং রিবক্সে চলেছে Integerযা খুব কার্যকর বলে মনে হচ্ছে না। আমি আমার মাথার উপরের দিকটি দেখতে পাচ্ছি না, আপনার কি এটির জন্য ভাল কারণ আছে?
Longকরার longপ্রথম, এবং তারপরint
এটি করার জন্য এখানে তিনটি উপায়:
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]
123Lপঠনযোগ্যতার জন্য সম্ভবত উচ্চ-কেস প্রত্যয় ব্যবহার করা উচিত ।
নন-নাল মানগুলির জন্য:
Integer intValue = myLong.intValue();
আপনি যদি ওভারফ্লোগুলি পরীক্ষা করে দেখেন এবং পেয়ারা ব্যবহার করেন তবে তা এখানে রয়েছে Ints.checkedCast():
int theInt = Ints.checkedCast(theLong);
বাস্তবায়ন নিখুঁত সহজ, এবং ওভারফ্লোতে অবৈধ অরগমেন্ট এক্সেকশনটি নিক্ষেপ করে:
public static int checkedCast(long value) {
int result = (int) value;
checkArgument(result == value, "Out of range: %s", value);
return result;
}
আপনার এটি কাস্ট করতে টাইপ করতে হবে।
long i = 100L;
int k = (int) i;
মনে রাখবেন যে দীর্ঘের একটি ইন্টের চেয়ে বড় পরিসীমা রয়েছে যাতে আপনি ডেটা হারাতে পারেন।
আপনি যদি বাক্সযুক্ত প্রকারের কথা বলছেন তবে ডকুমেন্টেশনটি পড়ুন ।
আপনি যদি জাভা 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);
}
}
এটি করার সর্বোত্তম সহজ উপায় হ'ল:
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;
}
জাভা 8 এ আপনি ব্যবহার করতে পারেন toIntExact। আপনি যদি nullমানগুলি পরিচালনা করতে চান তবে ব্যবহার করুন:
Integer intVal = longVal == null ? null : Math.toIntExact(longVal);
এই পদ্ধতিটি সম্পর্কে ভাল বিষয়টি হল যে এটি ArithmeticExceptionযদি আর্গুমেন্ট ( long) দ্বারা উপচে পড়ে যায় তবে এটি ছুড়ে যায় int।
ধরে নিচ্ছি দীর্ঘ ন্যূনতম
Integer intVal = ((Number)longVal).intValue();
এটি উদাহরণস্বরূপ y কাজ করে আপনি এমন একটি বস্তু পান যা একটি পূর্ণসংখ্যা বা দীর্ঘ হতে পারে। আমি জানি এটি কুৎসিত, তবে এটি ঘটে ...
ToIntExact (দীর্ঘ মান) ব্যবহার করে দীর্ঘ আর্গুমেন্টের মান ফিরে আসে, যদি মানটি কোনও intকে প্রবাহিত করে তবে একটি ব্যতিক্রম ছুঁড়ে দেয়। এটি 24 বা ততোধিক মাত্রের এপিআই স্তরের কাজ করবে।
int id = Math.toIntExact(longId);
জাভাতে, দীর্ঘ থেকে ইনটকে রূপান্তর করার জন্য একটি কঠোর উপায় রয়েছে
শুধু লনোগ ইন্টে রূপান্তর করতে পারে না, কোনও ধরণের শ্রেণি বিস্তৃত হয় তবে সংখ্যাটি সাধারণভাবে অন্যান্য সংখ্যা প্রকারে রূপান্তর করতে পারে, এখানে আমি আপনাকে দেখাব যে কীভাবে একটি দীর্ঘকে ইনট, অন্য ধরণের বিপরীতে রূপান্তর করতে হয়।
Long l = 1234567L;
int i = org.springframework.util.NumberUtils.convertNumberToTargetClass(l, Integer.class);