Java Academy · पाठ

Static Method References

static methods को call करने वाले lambdas को ClassName::methodName references से बदलें।

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

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

विधि संदर्भ क्या हैं

विधि संदर्भ एक संक्षिप्त लैम्ब्डा है जो किसी मौजूदा विधि को सौंपता है। जहाँ लैम्ब्डा केवल एक विधि को कॉल करता है, वहाँ विधि संदर्भ अधिक साफ़ और पढ़ने में आसान होता है।

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

List<String> names = List.of("Alice", "Bob", "Carol");

// Lambda:
names.forEach(s -> System.out.println(s));

// Equivalent method reference:
names.forEach(System.out::println);

स्थिर विधि संदर्भ का वाक्य-विन्यास

स्थिर विधि संदर्भ का रूप ClassName::staticMethodName होता है। इसका उपयोग वहाँ किया जा सकता है जहाँ कोई फ़ंक्शनल इंटरफ़ेस समान हस्ताक्षर वाली विधि की अपेक्षा करता है।

import java.util.stream.*;

// Integer.parseInt(String) matches Function<String, Integer>
List<String> strs = List.of("1","2","3","4","5");
List<Integer> nums = strs.stream()
    .map(Integer::parseInt)  // replaces s -> Integer.parseInt(s)
    .collect(Collectors.toList());
System.out.println(nums); // [1, 2, 3, 4, 5]

विधि संदर्भ के रूप में Math.abs

Math जैसी उपयोगिता classes की स्थिर विधियों का सीधे संदर्भ दिया जा सकता है:

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

List<Integer> values = List.of(-3, 5, -1, 8, -4);
List<Integer> abs = values.stream()
    .map(Math::abs)  // replaces v -> Math.abs(v)
    .collect(Collectors.toList());
System.out.println(abs); // [3, 5, 1, 8, 4]

Predicate के साथ स्थिर विधि संदर्भ

बूलियन परिणाम लौटाने वाली स्थिर विधियाँ Predicate के रूप में काम कर सकती हैं:

import java.util.stream.*;

// String.isEmpty() is an instance method, but we can use a static helper
// Objects.isNull matches Predicate<Object>
List<String> mixed = Arrays.asList("hello", null, "world", null);
long nullCount = mixed.stream()
    .filter(Objects::isNull)
    .count();
System.out.println(nullCount); // 2

long nonNull = mixed.stream()
    .filter(Objects::nonNull)
    .count();
System.out.println(nonNull); // 2

Comparator का स्थिर संदर्भ

Comparator से मेल खाने वाली स्थिर विधियों का भी संदर्भ दिया जा सकता है:

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

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

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

कस्टम स्थिर सहायक विधि

एक स्थिर उपयोगिता विधि परिभाषित करें और उसका सीधे संदर्भ दें:

class Validator {
    static boolean isPositive(int n) { return n > 0; }
    static String toLabel(int n) { return n > 0 ? "POS" : "NEG"; }
}

List<Integer> nums = List.of(-2, 3, -1, 5, 0);

List<Integer> positive = nums.stream()
    .filter(Validator::isPositive)
    .collect(Collectors.toList());
System.out.println(positive); // [3, 5]

List<String> labels = nums.stream()
    .map(Validator::toLabel)
    .collect(Collectors.toList());

स्थिर विधि के साथ BiFunction

दो पैरामीटर लेने वाली स्थिर विधियाँ BiFunction<T,U,R> से मेल खा सकती हैं:

import java.util.function.*;

// Math.max(int,int) → BiFunction... but needs IntBinaryOperator
java.util.function.IntBinaryOperator maxOp = Math::max;
System.out.println(maxOp.applyAsInt(7, 3)); // 7

// String.format as BiFunction? Only works if signature matches:
// Integer.sum(int,int) → IntBinaryOperator
java.util.function.IntBinaryOperator sum = Integer::sum;
System.out.println(sum.applyAsInt(10, 20)); // 30

Comparator.comparing + स्थिर संदर्भ से क्रमबद्ध करना

साफ़-सुथरे क्रमबद्धकरण के लिए Comparator.comparing को विधि संदर्भों के साथ संयोजित करें:

record Person(String name, int age) {}
List<Person> people = List.of(
    new Person("Charlie",30), new Person("Alice",25), new Person("Bob",35)
);

people.stream()
    .sorted(Comparator.comparing(Person::name))
    .forEach(p -> System.out.println(p.name()));
// Alice, Bob, Charlie

स्थिर विधि संदर्भों का उपयोग कब करें

स्थिर विधि संदर्भों का उपयोग तब करें जब:

  • लैम्ब्डा का मुख्य भाग किसी एक स्थिर विधि को कॉल करता हो
  • तर्कों में किसी रूपांतरण की आवश्यकता न हो
  • विधि का हस्ताक्षर फ़ंक्शनल इंटरफ़ेस से मेल खाता हो

यदि आपको तर्कों को बदलना हो या अतिरिक्त तर्क जोड़ना हो, तो लैम्ब्डा का ही उपयोग करें।

पठनीयता की तुलना

लैम्ब्डा और विधि संदर्भ शैलियों की साथ-साथ तुलना:

// Lambda style
Stream.of("1","2","3").map(s -> Integer.parseInt(s));
Stream.of(1,-2,3).filter(n -> n > 0);
Stream.of(-5,2,-1).map(n -> Math.abs(n));

// Method reference style
Stream.of("1","2","3").map(Integer::parseInt);
Stream.of(1,-2,3).filter(Validator::isPositive);
Stream.of(-5,2,-1).map(Math::abs);

सामान्य समस्या: गलत हस्ताक्षर

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

// Math.pow(double, double) needs two args — can't use as Function<Double, Double>
// This won't compile:
// Function<Double, Double> square = Math::pow; // ERROR

// Fix with lambda:
Function<Double, Double> square = n -> Math.pow(n, 2);
System.out.println(square.apply(5.0)); // 25.0

त्वरित जाँच

निम्नलिखित में से कौन-सा मान्य स्थिर विधि संदर्भ है जो Predicate<Object> के रूप में काम करता है?

पुनरावलोकन: स्थिर विधि संदर्भ

मुख्य बातें:

  • वाक्य-विन्यास: ClassName::staticMethodName
  • किसी एक स्थिर विधि को सौंपने वाले लैम्ब्डा का स्थान लेता है
  • विधि का हस्ताक्षर फ़ंक्शनल इंटरफ़ेस की अमूर्त विधि से मेल खाना चाहिए
  • Predicate, Function, Consumer, Comparator आदि के साथ काम करता है
  • तर्कों के रूपांतरण या अतिरिक्त तर्क की आवश्यकता होने पर लैम्ब्डा का उपयोग करें
शुरुआत निःशुल्क

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

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

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

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

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

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

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

static methods को call करने वाले lambdas को ClassName::methodName references से बदलें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Java Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

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

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

“Static 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 पर वापस जाएँ