দীর্ঘকে পূর্ণসংখ্যায় রূপান্তর করুন


308

জাভাতে Longকোনও Integerমানকে কীভাবে রূপান্তর করবেন ?


13
প্রথমে আপনাকে পরীক্ষা করা দরকার যে আপনি দীর্ঘমেয়াদি পূর্ণসংখ্যার ম্যাক্সভ্যালু অতিক্রম করেন না।
লুকাশজ


উত্তর:


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

5
এটি সেরা উত্তর কারণ এটি নাল মানকে পরিচালনা করে।
ভাইচেস্লাভ ডব্রোমাইস্লোভ

3
@ ভাইচেস্লাভড্রোবাইস্লোভ প্রশ্নটি দীর্ঘ মান সম্পর্কে ছিল, নাল মান সম্পর্কে নয়। এবং ব্যক্তিগতভাবে আমি নাল ইন -> নাল আউট ব্যবহার না করে এবং এর দ্বারা আমার অ্যাপ্লিকেশনটির মাধ্যমে নাল পরিবহনের পরিবর্তে নাল আপকে প্রত্যাখ্যান করতে বিশ্বাস করি। সুতরাং কেউ এই যুক্তিও দিতে পারে এটি সবচেয়ে খারাপ উত্তর :-)
সান প্যাট্রিক ফ্লয়েড

1
আপনি কেবল intValueপরিবর্তে কল করতে পারলে আপনি কেন দুবার নিক্ষেপ করবেন ? প্লাস এটি আনবক্সে দীর্ঘ, কাস্ট টু ইনট এবং রিবক্সে চলেছে Integerযা খুব কার্যকর বলে মনে হচ্ছে না। আমি আমার মাথার উপরের দিকটি দেখতে পাচ্ছি না, আপনার কি এটির জন্য ভাল কারণ আছে?
Dici

আমি ত্রুটিটি পাচ্ছি: আদিম ধরণের দীর্ঘ
আনন্দ

1
থিলো ওহ, আমি পেয়েছি মূলত আপনি রূপান্তর করছি Longকরার longপ্রথম, এবং তারপরint
mrid

123

এটি করার জন্য এখানে তিনটি উপায়:

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]

12
মাইনর স্টাইলিস্টিক ইস্যু: আপনার 123Lপঠনযোগ্যতার জন্য সম্ভবত উচ্চ-কেস প্রত্যয় ব্যবহার করা উচিত ।
জোয়

বা আপনি একটি ভাল ফন্ট ব্যবহার করতে পারেন ... এবং এখানে আমরা আবার যেতে পারি ...: ডি (ঠিক জে / কে, আমি এটিও করি)
ডেভিডসিএসবি

পুনঃটুইট প্রশ্নটি দীর্ঘ ছিল, নাল নয়
সান প্যাট্রিক ফ্লয়েড

2
পুনঃটুইট ভুলে যাবেন না যে লং ভেরিয়েবল মানটি কখনও কখনও নুল হতে পারে।
ভাইচেস্লাভ ডব্রোমাইস্লোভ

2
@ user64141 জাভাতে টাইপ কাস্টিং একটি জটিল সমস্যা। কাস্টিং অবজেক্টস ঠিক আছে, কারণ আপনি আসলে কিছু পরিবর্তন করছেন না, কেবল একই জিনিসটিকে অন্যরকমভাবে দেখছেন। তবে এক্ষেত্রে আপনার কাছে অবজেক্ট থেকে আদিম এবং তারপরে অটোবক্সিংয়ের উন্মাদনার মাধ্যমে আবার আপত্তি করার জন্য অর্থবোধক কাস্তের একটি শৃঙ্খলা রয়েছে, যদিও সিনট্যাক্সটি এটিকে আরও আদিম বলে। আমার কাছে এটি বক্সিং এবং আদিম রূপান্তর উভয়েরই অপব্যবহার। যা করা যায় তা সবই করা উচিত নয়।
সান প্যাট্রিক ফ্লয়েড


20

আপনি যদি ওভারফ্লোগুলি পরীক্ষা করে দেখেন এবং পেয়ারা ব্যবহার করেন তবে তা এখানে রয়েছে 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;
}

8

আপনার এটি কাস্ট করতে টাইপ করতে হবে।

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

মনে রাখবেন যে দীর্ঘের একটি ইন্টের চেয়ে বড় পরিসীমা রয়েছে যাতে আপনি ডেটা হারাতে পারেন।

আপনি যদি বাক্সযুক্ত প্রকারের কথা বলছেন তবে ডকুমেন্টেশনটি পড়ুন


6

আপনি যদি জাভা 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;
    }

4

জাভা 8 এ আপনি ব্যবহার করতে পারেন toIntExact। আপনি যদি nullমানগুলি পরিচালনা করতে চান তবে ব্যবহার করুন:

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

এই পদ্ধতিটি সম্পর্কে ভাল বিষয়টি হল যে এটি ArithmeticExceptionযদি আর্গুমেন্ট ( long) দ্বারা উপচে পড়ে যায় তবে এটি ছুড়ে যায় int


3

ধরে নিচ্ছি দীর্ঘ ন্যূনতম

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

এটি উদাহরণস্বরূপ y কাজ করে আপনি এমন একটি বস্তু পান যা একটি পূর্ণসংখ্যা বা দীর্ঘ হতে পারে। আমি জানি এটি কুৎসিত, তবে এটি ঘটে ...


2

ToIntExact (দীর্ঘ মান) ব্যবহার করে দীর্ঘ আর্গুমেন্টের মান ফিরে আসে, যদি মানটি কোনও intকে প্রবাহিত করে তবে একটি ব্যতিক্রম ছুঁড়ে দেয়। এটি 24 বা ততোধিক মাত্রের এপিআই স্তরের কাজ করবে।

int id = Math.toIntExact(longId);

0

দীর্ঘ দর্শনার্থী = 1000;

int convVisitors = (int) দর্শনার্থী;


-2

জাভাতে, দীর্ঘ থেকে ইনটকে রূপান্তর করার জন্য একটি কঠোর উপায় রয়েছে

শুধু লনোগ ইন্টে রূপান্তর করতে পারে না, কোনও ধরণের শ্রেণি বিস্তৃত হয় তবে সংখ্যাটি সাধারণভাবে অন্যান্য সংখ্যা প্রকারে রূপান্তর করতে পারে, এখানে আমি আপনাকে দেখাব যে কীভাবে একটি দীর্ঘকে ইনট, অন্য ধরণের বিপরীতে রূপান্তর করতে হয়।

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.