Kotlin forEach में इंडेक्स: कोड को तेज़ और स्मार्ट बनाएं

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

Kotlin forEach में करंट इंडेक्स कैसे पाएं: शुरुआत से एक्सपर्ट तक

\n\n

कल्पना करें: आप Kotlin में कोड लिख रहे हैं, यूज़र्स की लिस्ट प्रोसेस कर रहे हैं, और अचानक आपको एलिमेंट के साथ-साथ उसकी पोज़ीशन भी चाहिए। आप पुराने तरीके for (i in 0 until list.size) की ओर बढ़ते हैं... रुकिए! Kotlin में इससे कहीं ज़्यादा स्मार्ट और तेज़ तरीके हैं। इस आर्टिकल में हम सीखेंगे कि forEach में करंट इंडेक्स कैसे पाएं, अलग-अलग तरीकों की परफॉरमेंस तुलना करेंगे, और आपके प्रोजेक्ट के लिए सबसे बेस्ट तरीका चुनेंगे। यह सिर्फ डॉक्यूमेंटेशन का अनुवाद नहीं है - यह रियल-वर्ल्ड टेस्टिंग और Stack Overflow कम्युनिटी के अनुभव पर आधारित है।

\n\n

बिना इंडेक्स के forEach: क्यों है यह एक समस्या?

\n\n

स्टैंडर्ड list.forEach { item -> ... } इस्तेमाल करना आसान है, लेकिन जब एलिमेंट की पोज़ीशन चाहिए, तो कई डेवलपर यह हैक अपनाते हैं:

\n\n
var index = 0\nlist.forEach { item ->\n    println("$index: $item")\n    index++\n}
\n\n

यह काम तो करता है, लेकिन कोड बेकार लगता है और इसमें गलती की गुंजाइश रहती है (इंक्रीमेंट भूल गए? बग मिलेगा)। साथ ही, लूप के बाहर mutable वेरिएबल रखना फंक्शनल स्टाइल के खिलाफ है और मल्टीथ्रेडिंग में समस्या पैदा कर सकता है। आइए सही समाधान देखें।

\n\n

तरीका 1: withIndex() का उपयोग - सरल और सुंदर

\n\n

Stack Overflow पर सबसे लोकप्रिय जवाब है withIndex() फंक्शन। यह IndexedValue पेयर्स का एक सीक्वेंस लौटाता है, जहां हर एलिमेंट के पास index और value फील्ड होते हैं।

\n\n
val list = listOf("Kotlin", "Java", "Python")\nlist.withIndex().forEach { (index, value) ->\n    println("एलिमेंट #$index: $value")\n}
\n\n

यहां क्या हो रहा है? withIndex() एक लेज़ी सीक्वेंस बनाता है, जो हर एलिमेंट को IndexedValue ऑब्जेक्ट में रैप करता है। डीस्ट्रक्चरिंग (index, value) कोड को साफ और पढ़ने में आसान बनाती है।

\n\n

फायदे:

\n
    \n
  • संक्षिप्तता - तीन लाइनों की जगह एक लाइन
  • \n
  • लेज़ीनेस - मेमोरी में एक्स्ट्रा कलेक्शन नहीं बनाता
  • \n
  • पढ़ने में आसान - साफ दिखता है कि हम इंडेक्स के साथ काम कर रहे हैं
  • \n
\n\n

नुकसान:

\n
    \n
  • IndexedValue रैपर बनाने का थोड़ा ओवरहेड (लेकिन 99% मामलों में यह नगण्य है)
  • \n
\n\n

तरीका 2: forEachIndexed - बिल्ट-इन विकल्प

\n\n

Kotlin में पहले से तैयार forEachIndexed फंक्शन है, जो दो पैरामीटर (इंडेक्स और वैल्यू) के साथ लैम्ब्डा लेता है।

\n\n
list.forEachIndexed { index, value ->\n    println("पोज़ीशन $index: $value")\n}
\n\n

यह लगभग withIndex().forEach जैसा ही है, लेकिन बिना एक्स्ट्रा कॉल के। forEachIndexed का इंटरनल इम्प्लीमेंटेशन सीधे इंडेक्स पास करता है, जो थोड़ा तेज़ है।

\n\n

फायदे:

\n
    \n
  • सबसे छोटा और सीधा तरीका
  • \n
  • कोई इंटरमीडिएट ऑब्जेक्ट नहीं बनता
  • \n
  • Kotlin के लिए इडियोमैटिक (स्वाभाविक) है
  • \n
\n\n

नुकसान:

\n
    \n
  • withIndex() से कम फ्लेक्सिबल - इसे चेन के दूसरे ऑपरेटर्स (जैसे filter) के साथ जोड़ना मुश्किल है
  • \n
\n\n

तरीका 3: filterIndexed - जब इंडेक्स के आधार पर फ़िल्टर करना हो

\n\n

अगर आपको सिर्फ इंडेक्स नहीं, बल्कि पोज़ीशन के हिसाब से एलिमेंट फ़िल्टर करने हैं, तो filterIndexed सबसे अच्छा विकल्प है।

\n\n
val list = listOf("a", "b", "c", "d", "e")\nval evenIndexed = list.filterIndexed { index, _ -> index % 2 == 0 }\nprintln(evenIndexed) // [a, c, e]
\n\n

ध्यान दें: दूसरा पैरामीटर एलिमेंट है, लेकिन हम इसे _ से इग्नोर कर रहे हैं। Kotlin में अनइस्तेमाल वेरिएबल के लिए यह स्टैंडर्ड प्रैक्टिस है।

\n\n

फायदे:

\n
    \n
  • फ्लेक्सिबिलिटी - फ़िल्टरिंग और ट्रांसफॉर्मेशन को जोड़ सकते हैं
  • \n
  • साफ फंक्शनल स्टाइल
  • \n
\n\n

नु

ब्लॉग

पुस्तक अनुशंसाएँ