Destructuring declaration — यह क्या है, सिंटैक्स और Kotlin में उपयोग

लेखक: IT Sectr प्रकाशित: 2026-06-23 पढ़ने का समय: 7 मिनट

Destructuring declaration Kotlin की एक सुविधा है जो आपको एक ऑब्जेक्ट को एक ही एक्सप्रेशन में कई वेरिएबल्स में विघटित करने की अनुमति देती है। val (name, age) = user कंस्ट्रक्ट एक साथ दो वेरिएबल्स घोषित करता है, उन्हें ऑब्जेक्ट के घटकों से मान प्रदान करता है। Kotlin दस्तावेज़ (2026) के अनुसार, data class के साथ काम करते समय डिस्ट्रक्चरिंग कोड की मात्रा को 30–50% तक कम कर देती है। Destructuring declaration कोड को अधिक संक्षिप्त और पढ़ने योग्य बनाता है।

मुख्य बिंदु

  • Destructuring declaration — किसी ऑब्जेक्ट को वेरिएबल्स में विघटित करने के लिए सिंटैक्स val (a, b) = obj
  • ComponentN() — फ़ंक्शन component1(), component2(), component3() इत्यादि, स्वचालित रूप से कॉल किए जाते हैं
  • Data class प्राथमिक कंस्ट्रक्टर में घोषित सभी गुणों के लिए स्वचालित रूप से componentN() उत्पन्न करता है
  • Pair और Triple — दो और तीन मानों के लिए अंतर्निहित डिस्ट्रक्चरिंग वाली मानक कक्षाएं
  • Map.Entry — सुविधाजनक पुनरावृत्ति के लिए key और value में डिस्ट्रक्चरिंग का समर्थन करता है

डिस्ट्रक्चरिंग डिक्लेरेशन क्या है?

Destructuring declaration (विघटन घोषणा) Kotlin की एक सिंटैक्टिक कंस्ट्रक्शन है जो आपको एक क्लास इंस्टेंस को एक ही एक्सप्रेशन में कई वेरिएबल्स में विघटित करने की अनुमति देती है। बायीं तरफ कोष्ठक में वेरिएबल्स की एक सूची होती है, दायीं तरफ विघटित किया जा रहा ऑब्जेक्ट होता है। Kotlin स्वचालित रूप से प्रत्येक वेरिएबल के लिए संबंधित componentN() फ़ंक्शन को कॉल करता है, जहाँ N कोष्ठक में वेरिएबल की क्रम संख्या है।

डिस्ट्रक्चरिंग डिक्लेरेशन का सबसे अधिक उपयोग data classes के साथ किया जाता है। Kotlin कंपाइलर प्रत्येक data class के लिए प्राथमिक कंस्ट्रक्टर में गुणों की संख्या के आधार पर स्वचालित रूप से component1(), component2() इत्यादि उत्पन्न करता है। data मॉडिफ़ायर के बिना सामान्य कक्षाओं के लिए, componentN() उत्पन्न नहीं होते हैं, लेकिन उन्हें operator कीवर्ड के साथ मैन्युअल रूप से परिभाषित किया जा सकता है।

डिस्ट्रक्चरिंग डिक्लेरेशन जोड़ियों के संग्रह, फ़ंक्शन परिणामों और Map पुनरावृत्ति के साथ काम करते समय कोड को सरल बनाने की अपनी क्षमता के कारण एक लोकप्रिय पैटर्न बन गया है। person.firstName, person.lastName लिखने के बजाय, डेवलपर val (firstName, lastName) = person लिखता है। यह पंक्तियों की संख्या को कम करता है और विशेष रूप से लूप्स और लैम्ब्डा में पठनीयता में सुधार करता है।

Kotlin में डिस्ट्रक्चरिंग कैसे काम करती है?

val (a, b) = obj कंस्ट्रक्ट का सामना करने पर, Kotlin कंपाइलर निम्नलिखित कोड उत्पन्न करता है: val a = obj.component1(); val b = obj.component2(). यदि वेरिएबल्स var के साथ घोषित किए गए हैं, तो var असाइनमेंट उत्पन्न होते हैं। प्रत्येक वेरिएबल का प्रकार संबंधित componentN() फ़ंक्शन के रिटर्न प्रकार से अनुमानित होता है। इसका मतलब है कि डिस्ट्रक्चरिंग डिक्लेरेशन पूरी तरह से टाइप-सुरक्षित है और संकलन समय पर जाँची जाती है।

kotlin
data class Person(val firstName: String, val lastName: String, val age: Int)

fun main() {
    val person = Person("Alice", "Smith", 30)

    // डिस्ट्रक्चरिंग: component1(), component2(), component3()
    val (firstName, lastName, age) = person
    println("$firstName $lastName, $age वर्ष पुराना")
}

लिस्टिंग में, Person तीन गुणों वाली एक data class है। Kotlin component1() → firstName, component2() → lastName, component3() → age उत्पन्न करता है। अभिव्यक्ति val (firstName, lastName, age) = person इन फ़ंक्शन को कॉल करती है और परिणाम प्रदान करती है। महत्वपूर्ण: वेरिएबल नामों का गुण नामों से मेल खाना आवश्यक नहीं है — कंपाइलर केवल componentN() के क्रम और उनके प्रकारों को देखता है। आप केवल पहले N गुणों को विघटित कर सकते हैं, बाकी को अनदेखा कर सकते हैं।

data classes और मानक प्रकारों की डिस्ट्रक्चरिंग

Data classes डिस्ट्रक्चरिंग डिक्लेरेशन के लिए प्राथमिक उम्मीदवार हैं। प्रत्येक data class स्वचालित रूप से प्राथमिक कंस्ट्रक्टर के सभी गुणों के लिए componentN() प्राप्त करती है। componentN() का क्रम गुण घोषणाओं के क्रम से मेल खाता है। इसका मतलब है कि जब आप data class में फ़ील्ड का क्रम बदलते हैं, तो डिस्ट्रक्चरिंग में वेरिएबल्स का क्रम भी बदल जाता है — जो सूक्ष्म बग का कारण बन सकता है।

kotlin
// Pair डिस्ट्रक्चरिंग
val pair = Pair("key", 42)
val (key, value) = pair
println("$key -> $value")

// Triple डिस्ट्रक्चरिंग
val triple = Triple("A", "B", "C")
val (first, second, third) = triple

// Map.Entry लूप में
val map = mapOf("a" to 1, "b" to 2)
for ((k, v) in map) {
    println("$k = $v")
}

Pair और Triple दो और तीन घटकों के लिए अंतर्निहित डिस्ट्रक्चरिंग वाली मानक कक्षाएं हैं। Pair का उपयोग अक्सर उन फ़ंक्शनों के लिए रिटर्न प्रकार के रूप में किया जाता है जिन्हें एक अलग data class बनाए बिना दो संबंधित मान लौटाने की आवश्यकता होती है। Map.Entry पर for लूप में, (k, v) = entry कंस्ट्रक्ट component1() और component2() के माध्यम से कुंजी और मान को विघटित करता है। Kotlin में Map पर पुनरावृत्ति करने का यह मानक पैटर्न है, जो पूरी तरह से key और value के स्पष्ट कॉल को बदल देता है।

अप्रयुक्त वेरिएबल्स के लिए अंडरस्कोर

यदि डिस्ट्रक्चरिंग के दौरान कुछ घटकों की आवश्यकता नहीं है, तो Kotlin आपको उन्हें अंडरस्कोर _ से बदलने की अनुमति देता है। इससे पठनीयता में सुधार होता है — पाठक तुरंत देखता है कि घटक को अनदेखा किया जा रहा है। इसके अलावा, _ का उपयोग एक अप्रारंभिक वेरिएबल तक आकस्मिक पहुँच को रोकता है: कंपाइलर _ के लिए कोई वेरिएबल नहीं बनाता है, जिससे अप्रयुक्त वेरिएबल्स के बारे में चेतावनियाँ समाप्त हो जाती हैं।

kotlin
data class Order(
    val id: Long,
    val customerName: String,
    val amount: Double,
    val status: String
)

fun process(orders: List<Order>) {
    for ((id, _, amount) in orders) {
        println("आदेश $id: $amount")
    }
}

लिस्टिंग में, Order में चार गुण हैं, लेकिन लूप को केवल id और amount की आवश्यकता है। customerName के स्थान पर अंडरस्कोर कंपाइलर को बताता है “component2() को छोड़ें”। Kotlin component2() को कॉल नहीं करता और इस घटक के लिए कोई वेरिएबल नहीं बनाता। महत्वपूर्ण: अंडरस्कोर का उपयोग केवल डिस्ट्रक्चरिंग डिक्लेरेशन में किया जा सकता है, data class कंस्ट्रक्टर में नहीं। यदि कई लगातार घटकों को छोड़ा जाता है, तो प्रत्येक को अपना स्वयं का अंडरस्कोर मिलता है।

कस्टम कक्षाओं के लिए componentN() बनाना

data मॉडिफ़ायर के बिना कक्षाओं के लिए, आप operator कीवर्ड जोड़कर मैन्युअल रूप से componentN() परिभाषित कर सकते हैं। यह आपको किसी भी क्लास के साथ डिस्ट्रक्चरिंग डिक्लेरेशन का उपयोग करने की अनुमति देता है, जिसमें तीसरे पक्ष की कक्षाएं शामिल हैं जिनका स्रोत कोड संशोधित नहीं किया जा सकता — बस operator के साथ एक एक्सटेंशन फ़ंक्शन लिखें। यह दृष्टिकोण विशेष रूप से लाइब्रेरी कक्षाओं और Java कक्षाओं के लिए उपयोगी है जिनमें स्वचालित componentN() नहीं है।

kotlin
class Rect(val width: Int, val height: Int)

operator fun Rect.component1(): Int = width
operator fun Rect.component2(): Int = height

// getters वाली Java क्लास के लिए
operator fun Dimension.component1(): Int = width
operator fun Dimension.component2(): Int = height

fun main() {
    val rect = Rect(1920, 1080)
    val (w, h) = rect
    println("रिज़ॉल्यूशन: ${w}x${h}")
}

उदाहरण में, Rect बिना data के एक सामान्य क्लास है। operator fun component1() = width और component2() = height के साथ एक्सटेंशन फ़ंक्शन डिस्ट्रक्चरिंग समर्थन जोड़ते हैं। इसी प्रकार java.awt.Dimension के लिए: Dimension पर एक operator एक्सटेंशन इसे width और height में विघटित करने की अनुमति देता है। सीमा: डिस्ट्रक्चरिंग डिक्लेरेशन के लिए घटकों की अधिकतम संख्या 5 है। सिद्धांत रूप में आप component6() और उससे ऊपर परिभाषित कर सकते हैं, लेकिन Kotlin कोष्ठक में 6+ वेरिएबल्स के लिए संबंधित सिंटैक्स उत्पन्न नहीं करेगा।

अक्सर पूछे जाने वाले प्रश्न

क्या प्रत्येक data class डिस्ट्रक्चरिंग का समर्थन करती है?

हाँ, प्रत्येक data class स्वचालित रूप से प्राथमिक कंस्ट्रक्टर के सभी गुणों के लिए componentN() प्राप्त करती है। क्लास बॉडी में घोषित गुण (val/var के बिना कंस्ट्रक्टर पैरामीटर का उपयोग करके) componentN() उत्पन्न नहीं करते हैं।

क्या होता है यदि वेरिएबल्स की संख्या मेल नहीं खाती?

यदि val (a, b, c) = obj में केवल दो component फ़ंक्शन वाला ऑब्जेक्ट है, तो कंपाइलर एक त्रुटि देगा। यदि कम वेरिएबल्स हैं (val (a) = pair), तो Kotlin केवल component1() को कॉल करेगा और component2() को अनदेखा करेगा — कोई त्रुटि नहीं होगी।

क्या बिना लूप के Map को डिस्ट्रक्चर किया जा सकता है?

हाँ, Map.Entry डिस्ट्रक्चरिंग का समर्थन करता है: val (key, value) = map.entries.first(). डिस्ट्रक्चरिंग पूरे Map पर एक साथ काम नहीं करती — केवल तत्व दर तत्व, for लूप में या इटरेटर के माध्यम से।

क्या लैम्ब्डा में डिस्ट्रक्चरिंग काम करती है?

हाँ, Kotlin लैम्ब्डा पैरामीटर में डिस्ट्रक्चरिंग का समर्थन करता है: map.forEach { (k, v) -> ... }। लैम्ब्डा पैरामीटर में data classes के लिए, आपको पैरामीटर के चारों ओर नेस्टेड कोष्ठक जोड़ने की आवश्यकता है।

डिस्ट्रक्चरिंग का अधिकतम आकार क्या है?

Kotlin डिस्ट्रक्चरिंग डिक्लेरेशन में 5 वेरिएबल्स तक का समर्थन करता है। यदि आपको पाँच से अधिक गुणों को विघटित करने की आवश्यकता है, तो उन्हें नेस्टेड data classes में संयोजित करें या एक वेरिएबल के अंदर Pair/Triple का उपयोग करें।

सारांश

  • Destructuring declaration — सिंटैक्स val (a, b) = obj, एक ऑब्जेक्ट को एक ही एक्सप्रेशन में कई वेरिएबल्स में विघटित करता है
  • ComponentN() — फ़ंक्शन component1(), component2(), ... डिस्ट्रक्चरिंग के दौरान कंपाइलर द्वारा स्वचालित रूप से कॉल किए जाते हैं
  • Data class प्राथमिक कंस्ट्रक्टर के सभी गुणों के लिए स्वचालित रूप से componentN() उत्पन्न करती है
  • Pair और Triple — 2 और 3 घटकों के लिए अंतर्निहित डिस्ट्रक्चरिंग वाली मानक कक्षाएं
  • अंडरस्कोर _ वेरिएबल बनाए बिना अप्रयुक्त घटकों को बदलता है
  • Operator componentN() एक्सटेंशन फ़ंक्शन में Java सहित किसी भी क्लास में डिस्ट्रक्चरिंग जोड़ता है
  • Map.Entry for लूप ((k, v) in map) में — शब्दकोश पर पुनरावृत्ति के लिए मानक मुहावरेदार Kotlin पैटर्न

हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे

IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।

परियोजना पर चर्चा करें

यह भी पढ़ें