Java Academy · पाठ

Arbitrary-Instance Method References

receiver बताए बिना किसी instance method का reference लें—यह Stream operations में बड़े पैमाने पर उपयोग होता है।

पाठ 3, कुल 4 में से13 चरण

Arbitrary-Instance Method References, CoddyKit पर Java Academy का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह Java Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Java Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

मनमाने-इंस्टेंस संदर्भ क्या होते हैं?

मनमाने-इंस्टेंस का विधि संदर्भ ClassName::instanceMethod का उपयोग करता है। यहाँ कार्यात्मक इंटरफ़ेस का पहला आर्ग्युमेंट रिसीवर के रूप में कार्य करता है — प्रत्येक तत्व वह ऑब्जेक्ट बन जाता है जिस पर विधि कॉल की जाती है।

import java.util.*;
import java.util.stream.*;

List<String> names = List.of("alice","bob","carol");

// String::toUpperCase — receiver is each list element
List<String> upper = names.stream()
    .map(String::toUpperCase)
    .collect(Collectors.toList());
System.out.println(upper); // [ALICE, BOB, CAROL]

रिसीवर का निर्धारण कैसे होता है

मनमाने-इंस्टेंस संदर्भ Type::method में, कार्यात्मक इंटरफ़ेस का पहला पैरामीटर this (रिसीवर) बन जाता है:

// String::length matches Function<String, Integer>
// Equivalent to: s -> s.length()
Function<String, Integer> len = String::length;
System.out.println(len.apply("Java")); // 4

// String::isEmpty matches Predicate<String>
// Equivalent to: s -> s.isEmpty()
Predicate<String> isEmpty = String::isEmpty;
System.out.println(isEmpty.test(""));   // true

स्ट्रीम ऑपरेशनों में व्यापक उपयोग

मनमाने-इंस्टेंस संदर्भ स्ट्रीम प्रसंस्करण-श्रृंखलाओं में सबसे सामान्य प्रकार के संदर्भ हैं:

List<String> words = List.of("Hello","","World","","Java");

// filter with String::isEmpty
long empty = words.stream().filter(String::isEmpty).count();
System.out.println(empty); // 2

// map with String::toLowerCase
words.stream()
     .filter(s -> !s.isEmpty())
     .map(String::toLowerCase)
     .forEach(System.out::println);

दो आर्ग्युमेंट वाली विधियों के लिए BiFunction शैली

किसी प्रकार की दो-आर्ग्युमेंट वाली विधि BiFunction<T, U, R> से मेल खाती है, जहाँ T रिसीवर और U आर्ग्युमेंट होता है:

import java.util.function.*;

// String::startsWith → BiPredicate<String, String>
// receiver=first arg, argument=second arg
BiPredicate<String, String> starts = String::startsWith;
System.out.println(starts.test("JavaStream", "Java")); // true
System.out.println(starts.test("Python", "Java"));      // false

मनमाने-इंस्टेंस के साथ Comparator

String::compareTo Comparator<String> से मेल खाता है — तुलनाकर्ता के दो आर्ग्युमेंट रिसीवर और पैरामीटर बन जाते हैं:

List<String> words = List.of("banana","apple","cherry");

List<String> sorted = words.stream()
    .sorted(String::compareTo)
    .collect(Collectors.toList());
System.out.println(sorted); // [apple, banana, cherry]

कस्टम वर्ग का मनमाना-इंस्टेंस

यह केवल JDK प्रकारों तक सीमित नहीं है; किसी भी वर्ग की इंस्टेंस विधियों पर काम करता है:

record Product(String name, double price) {
    boolean isExpensive() { return price > 50; }
    String label() { return name + " ($" + price + ")"; }
}

List<Product> products = List.of(
    new Product("Widget", 9.99),
    new Product("Gadget", 99.99),
    new Product("Donut", 1.50)
);

products.stream()
    .filter(Product::isExpensive)
    .map(Product::label)
    .forEach(System.out::println); // Gadget ($99.99)

विशिष्ट-इंस्टेंस से अंतर

मुख्य अंतर:

  • विशिष्ट: obj::method — obj हमेशा रिसीवर होता है
  • मनमाना: Type::method — प्रत्येक तत्व ही रिसीवर होता है
String fixed = "prefix";
// Specific instance: fixed is always the receiver
Predicate<String> startsFixed = fixed::startsWith; // always checks 'prefix'.startsWith(arg)

// Arbitrary instance: each element is the receiver
Predicate<String> isEmpty = String::isEmpty; // each element.isEmpty()

Collectors में विधि संदर्भ

मनमाने-इंस्टेंस संदर्भ कलेक्टर के साथ स्वाभाविक रूप से संयोजित होते हैं:

List<String> items = List.of("  hello "," world ","  java  ");
List<String> trimmed = items.stream()
    .map(String::trim)
    .collect(Collectors.toList());
System.out.println(trimmed); // [hello, world, java]

विधि संदर्भों की श्रृंखला बनाना

विधि संदर्भों को Function पर andThen/compose के साथ श्रृंखलाबद्ध किया जा सकता है:

Function<String, String> pipeline =
    ((Function<String, String>) String::trim)
        .andThen(String::toUpperCase);

System.out.println(pipeline.apply("  hello world  "));
// HELLO WORLD

सावधानी: ओवरलोड की गई विधियाँ

जब किसी विधि के कई ओवरलोड हों, तो कंपाइलर को यह अनुमान लगाना पड़ता है कि कौन-सा ओवरलोड कार्यात्मक इंटरफ़ेस से मेल खाता है। यदि अस्पष्टता हो, तो यह कंपाइलेशन त्रुटि होती है — अस्पष्टता दूर करने के लिए लैम्ब्डा का उपयोग करें:

// println is overloaded — which one?
// Consumer<String> c = System.out::println; // OK — infers println(String)
// Consumer<Object> c2 = System.out::println; // OK

// But if ambiguous:
// Function<Object,?> fn = System.out::println; // Error — println doesn't return a value

प्रदर्शन

विधि संदर्भ और लैम्ब्डा एक ही बाइटकोड में कंपाइल होते हैं (invokedynamic के माध्यम से)। प्रदर्शन में कोई अंतर नहीं होता — जो अधिक पठनीय हो, उसे चुनें। जब विधि संदर्भ उद्देश्य को स्पष्ट रूप से व्यक्त करता है, तो अधिकांश शैली-निर्देश उसे प्राथमिकता देते हैं।

त्वरित जाँच

.map() के साथ उपयोग करने पर String::toUpperCase क्या दर्शाता है?

पुनरावृत्ति: मनमाने-इंस्टेंस विधि संदर्भ

मुख्य बातें:

  • वाक्यविन्यास: ClassName::instanceMethod — प्रत्येक तत्व रिसीवर होता है
  • ऐसे कार्यात्मक इंटरफ़ेस से मेल खाता है जिनमें रिसीवर पहला पैरामीटर होता है
  • .map(), .filter(), .sorted(), .forEach() में सबसे अधिक उपयोग होता है
  • दो-आर्ग्युमेंट वाली विधियाँ → BiFunction/BiPredicate, जिसमें तत्व रिसीवर होता है
  • लैम्ब्डा की तुलना में प्रदर्शन में कोई अंतर नहीं — पठनीयता के आधार पर चुनें
शुरुआत निःशुल्क

एआई शिक्षक के साथ Java सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
104
पाठ
374

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

क्या “Arbitrary-Instance Method References” पाठ निःशुल्क है?

हाँ—“Arbitrary-Instance Method References” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और Java Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। Java Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“Arbitrary-Instance Method References” में मैं क्या सीखूँगा?

receiver बताए बिना किसी instance method का reference लें—यह Stream operations में बड़े पैमाने पर उपयोग होता है। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Java Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या Java Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Java Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।

“Arbitrary-Instance Method References” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस Java Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर Java Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. Static Method References
  2. विशिष्ट Instance पर Instance Method References
  3. Arbitrary-Instance Method References
  4. Constructor References
← Java Academy पर वापस जाएँ