कन्वर्ट लॉन्ग को इंटेगर में


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
यह सबसे अच्छा जवाब है क्योंकि यह NULL मान को संभालता है।
वायाचेस्लाव डोब्रोमाइसलोव

3
@ViacheslavDobromyslov सवाल दीर्घ मूल्यों के बारे में था, अशक्त मूल्यों के बारे में नहीं। और व्यक्तिगत रूप से मेरा मानना ​​है कि null in - null का उपयोग करने के बजाय null up front को अस्वीकार करना है और इस प्रकार अपने एप्लिकेशन के माध्यम से null को ट्रांसपोर्ट करना है। तो कोई यह भी तर्क दे सकता है कि यह सबसे खराब उत्तर है :-)
सीन पैट्रिक फ्लॉयड

1
जब आप सिर्फ कॉल कर सकते हैं तो आप दो बार क्यों intValueडालेंगे? इसके अलावा, यह लंबे समय तक अनबॉक्स करने जा रहा है, इंट टू कास्ट और रीबॉक्स टू Integer, जो बहुत उपयोगी नहीं लगता है। मैं अपने सिर के ऊपर बिंदु नहीं देखता, क्या आपके पास इसके लिए एक अच्छा कारण है?
डेसी जूल

मुझे त्रुटि मिल रही है: आदिम प्रकार लंबे समय पर intValue () को आमंत्रित नहीं किया जा सकता
आनंद

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पठनीयता के लिए ऊपरी-केस प्रत्यय का उपयोग करना चाहिए ।
जॉय

या आप एक अच्छे फ़ॉन्ट का उपयोग कर सकते हैं ... और यहाँ हम फिर से जाते हैं ...: D (बस j / k, मैं भी ऐसा करता हूं)
davidcsb

@ViacheslavDobromyslov सच। लोंग के बारे में सवाल था, अशक्त नहीं
सीन पैट्रिक फ्लोयड

2
@SeanPatrickFloyd हां। मत भूलो कि लॉन्ग वेरिएबल वैल्यू कभी-कभी NULL हो सकती है।
वायाचेस्लाव डोब्रोमिस्लाव

2
@ user64141 जावा में टाइप कास्टिंग एक जटिल मुद्दा है। ऑब्जेक्ट्स को कास्टिंग करना ठीक है, क्योंकि आप वास्तव में कुछ भी नहीं बदल रहे हैं, बस एक ही वस्तु को एक अलग तरीके से देख रहे हैं। लेकिन इस मामले में, आपके पास सार्थक जातियों की एक श्रृंखला है, वस्तु से आदिम और फिर, ऑटोबॉक्सिंग के पागलपन के माध्यम से, फिर से आपत्ति करने के लिए, भले ही वाक्य रचना यह एक और आदिम है। मेरे लिए, यह मुक्केबाजी और आदिम रूपांतरण दोनों का दुरुपयोग है। जो कुछ भी किया जा सकता है वह नहीं किया जाना चाहिए।
सीन पैट्रिक फ्लॉयड


20

यदि आप ओवरफ्लो की जांच करना चाहते हैं और अमरूद का उपयोग करना चाहते हैं , तो यह है Ints.checkedCast():

int theInt = Ints.checkedCast(theLong);

कार्यान्वयन मृत सरल है, और ओवरफ़्लो पर IllegalArgumentException को फेंकता है :

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

Java 8 में आप उपयोग कर सकते हैं toIntExact। यदि आप nullमानों को संभालना चाहते हैं, तो उपयोग करें:

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

इस विधि के बारे में अच्छी बात यह है कि यह एक ArithmeticExceptionतर्क को फेंकता है ( long) ओवरफ्लो करता है int


3

यह मानते हुए कि अशक्त longVal नहीं है

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

यह उदाहरण के लिए काम करता है y आपको एक ऑब्जेक्ट मिलता है जो एक इंटेगर या लॉन्ग हो सकता है। मुझे पता है कि बदसूरत है, लेकिन ऐसा होता है ...


2

यदि toIntExact (long value) का उपयोग करना लंबे तर्क का मान लौटाता है, तो एक अपवाद को फेंक दिया जाता है यदि मान एक intfl को ओवरफ्लो करता है। यह केवल एपीआई स्तर 24 या इसके बाद के संस्करण पर काम करेगा।

int id = Math.toIntExact(longId);


-2

जावा में, लंबे समय को अंतर में बदलने का एक कठोर तरीका है

न केवल lnog इंट में परिवर्तित हो सकता है, किसी भी प्रकार की क्लास फैली हुई संख्या सामान्य रूप से अन्य नंबर प्रकार में परिवर्तित हो सकती है, यहां मैं आपको दिखाऊंगा कि लंबे समय को इंट, अन्य प्रकार के विपरीत में कैसे परिवर्तित किया जाए।

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

15
मुझे लगता है कि आप कहीं एक अमूर्त कारखाना बनाना भूल गए
user541686
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.