Kotlin forEach में करंट इंडेक्स कैसे पाएं: शुरुआत से एक्सपर्ट तक
\n\nकल्पना करें: आप Kotlin में कोड लिख रहे हैं, यूज़र्स की लिस्ट प्रोसेस कर रहे हैं, और अचानक आपको एलिमेंट के साथ-साथ उसकी पोज़ीशन भी चाहिए। आप पुराने तरीके for (i in 0 until list.size) की ओर बढ़ते हैं... रुकिए! Kotlin में इससे कहीं ज़्यादा स्मार्ट और तेज़ तरीके हैं। इस आर्टिकल में हम सीखेंगे कि forEach में करंट इंडेक्स कैसे पाएं, अलग-अलग तरीकों की परफॉरमेंस तुलना करेंगे, और आपके प्रोजेक्ट के लिए सबसे बेस्ट तरीका चुनेंगे। यह सिर्फ डॉक्यूमेंटेशन का अनुवाद नहीं है - यह रियल-वर्ल्ड टेस्टिंग और Stack Overflow कम्युनिटी के अनुभव पर आधारित है।
बिना इंडेक्स के forEach: क्यों है यह एक समस्या?
\n\nस्टैंडर्ड list.forEach { item -> ... } इस्तेमाल करना आसान है, लेकिन जब एलिमेंट की पोज़ीशन चाहिए, तो कई डेवलपर यह हैक अपनाते हैं:
var index = 0\nlist.forEach { item ->\n println("$index: $item")\n index++\n}\n\nयह काम तो करता है, लेकिन कोड बेकार लगता है और इसमें गलती की गुंजाइश रहती है (इंक्रीमेंट भूल गए? बग मिलेगा)। साथ ही, लूप के बाहर mutable वेरिएबल रखना फंक्शनल स्टाइल के खिलाफ है और मल्टीथ्रेडिंग में समस्या पैदा कर सकता है। आइए सही समाधान देखें।
\n\nतरीका 1: withIndex() का उपयोग - सरल और सुंदर
\n\nStack Overflow पर सबसे लोकप्रिय जवाब है withIndex() फंक्शन। यह IndexedValue पेयर्स का एक सीक्वेंस लौटाता है, जहां हर एलिमेंट के पास index और value फील्ड होते हैं।
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
IndexedValueरैपर बनाने का थोड़ा ओवरहेड (लेकिन 99% मामलों में यह नगण्य है) \n
तरीका 2: forEachIndexed - बिल्ट-इन विकल्प
\n\nKotlin में पहले से तैयार forEachIndexed फंक्शन है, जो दो पैरामीटर (इंडेक्स और वैल्यू) के साथ लैम्ब्डा लेता है।
list.forEachIndexed { index, value ->\n println("पोज़ीशन $index: $value")\n}\n\nयह लगभग withIndex().forEach जैसा ही है, लेकिन बिना एक्स्ट्रा कॉल के। forEachIndexed का इंटरनल इम्प्लीमेंटेशन सीधे इंडेक्स पास करता है, जो थोड़ा तेज़ है।
फायदे:
\n- \n
- सबसे छोटा और सीधा तरीका \n
- कोई इंटरमीडिएट ऑब्जेक्ट नहीं बनता \n
- Kotlin के लिए इडियोमैटिक (स्वाभाविक) है \n
नुकसान:
\n- \n
withIndex()से कम फ्लेक्सिबल - इसे चेन के दूसरे ऑपरेटर्स (जैसेfilter) के साथ जोड़ना मुश्किल है \n
तरीका 3: filterIndexed - जब इंडेक्स के आधार पर फ़िल्टर करना हो
\n\nअगर आपको सिर्फ इंडेक्स नहीं, बल्कि पोज़ीशन के हिसाब से एलिमेंट फ़िल्टर करने हैं, तो filterIndexed सबसे अच्छा विकल्प है।
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
नु