1. कार्य पद्धती

इंटरफेसमध्ये फक्त एक पद्धत असल्यास , त्या इंटरफेस प्रकारातील व्हेरिएबलला लॅम्बडा एक्सप्रेशन (लॅम्बडा फंक्शन) द्वारे दिलेले मूल्य नियुक्त केले जाऊ शकते. असे इंटरफेस फंक्शनल इंटरफेस म्हणून ओळखले जाऊ लागले (जावाने लॅम्बडा फंक्शन्ससाठी समर्थन जोडल्यानंतर).

उदाहरणार्थ, Java मध्ये Consumer<Type>इंटरफेस आहे, ज्यामध्ये accept(Type obj)पद्धत आहे. या इंटरफेसची आवश्यकता का आहे?

Java 8 मध्ये, संग्रहांची एक forEach()पद्धत आहे, जी तुम्हाला संग्रहातील प्रत्येक घटकासाठी काही क्रिया करू देते . आणि इथे फंक्शनल इंटरफेसचा वापर पद्धतीमध्ये क्रिया पास करण्यासाठी केला जातो . Consumer<T>forEach()

तुम्ही संग्रहातील सर्व घटक कसे प्रदर्शित करू शकता ते येथे आहे :

ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "Hello", "how's", "life?");

list.forEach( (s) -> System.out.println(s) );
संग्रहातील सर्व घटक प्रदर्शित करणे (लॅम्बडा अभिव्यक्ती वापरुन)

कंपाइलर वरील कोडला खालील कोडमध्ये रूपांतरित करेल:

ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "Hello", "how's", "life?");

list.forEach(new Consumer<String>()
{
   public void accept(String s)
   {
      System.out.println(s));
   }
});
संग्रहातील सर्व घटक प्रदर्शित करणे (निनावी वर्ग वापरून)

पहिली आवृत्ती दुसऱ्यापेक्षा निश्चितच लहान आहे. आणि लॅम्बडा अभिव्यक्तीसह कोड वाचणे कठीण असताना, निनावी अंतर्गत वर्गांसह कोड वाचणे कधीकधी कठीण असते.



2. पद्धत संदर्भ

तथापि, आमचा लॅम्बडा अभिव्यक्ती कोड आणखी लहान लिहिला जाऊ शकतो.

प्रथम, तुम्ही पॅरामीटरच्या आसपासचे कंस वगळू शकता s:

list.forEach( (s) -> System.out.println(s) );
आधी
list.forEach( s -> System.out.println(s) );
नंतर

हे केवळ एक पॅरामीटर असल्यासच केले जाऊ शकते . जर अनेक पॅरामीटर्स असतील , तर तुम्ही कंस वापरणे आवश्यक आहे .

आणि दुसरे, आपण ते असे लिहू शकता:

list.forEach( System.out::println );
सर्वात संक्षिप्त नोटेशन

हे तंतोतंत समान नोटेशन आहे. लक्षात ठेवा की नंतर कोणतेही कंस नाहीत println.

येथे आमच्याकडे समान कोड आहे — एक पद्धत कॉल:

object::method
x -> object.method(x)

याचा विचार करा: आम्हाला संग्रहातील प्रत्येक घटकासाठी काही क्रिया करायची होती list. जर क्रिया सिंगल फंक्शन कॉल असेल (जसे की println()), तर ते फंक्शनला पॅरामीटर म्हणून पद्धतमध्ये पास करणे योग्य आहे.

पण आम्ही संकलकांना कसे समजावून सांगू की आम्हाला कॉल करण्यापेक्षा पद्धत पास करायची आहे? हे करण्यासाठी, डॉट ऑपरेटरऐवजी, आम्ही पद्धतीच्या नावापूर्वी दोन कोलन वापरतो. टर्नरी ऑपरेटर दर्शवण्यासाठी एकच कोलन आधीच वापरला जातो.

हे सर्वात सोपा आणि सर्वात संक्षिप्त नोटेशन आहे.



3. कन्स्ट्रक्टर

जेव्हा आम्ही I/O प्रवाहांसह कार्य करतो तेव्हा दुहेरी कोलनसह पद्धत संदर्भ अतिशय सुलभ असतात. हे तुम्हाला थोड्या वेळाने दिसेल.

यादरम्यान, पद्धत संदर्भ पास करण्याच्या 3 लोकप्रिय मार्गांबद्दल बोलूया:

ऑब्जेक्टच्या पद्धतीचा संदर्भ

ऑब्जेक्टच्या पद्धतीचा संदर्भ देण्यासाठी, आपल्याला असे काहीतरी लिहावे लागेल . हा कोड समतुल्य आहे .object::method
x -> object.method(x)

स्पेशल thisआणि superव्हेरिएबल्स ऑब्जेक्ट म्हणून वापरले जाऊ शकतात.

वर्गाच्या पद्धतीचा संदर्भ

स्थिर पद्धतीचा संदर्भ देण्यासाठी, तुम्हाला असे काहीतरी लिहावे लागेल . हा कोड कोडमध्ये रूपांतरित होतोclass::methodx -> class.method(x);

कन्स्ट्रक्टरचा संदर्भ

कन्स्ट्रक्टर स्टॅटिक क्लास पद्धतीप्रमाणेच वागतो, त्यामुळे तुम्ही कन्स्ट्रक्टरचा संदर्भ देखील देऊ शकता. हे असे दिसते: .class::new

उदाहरणार्थ, तुम्ही कलेक्शनसाठी इरेजर टाइप करू शकता आणि toArray()इच्छित अ‍ॅरे तयार करणार्‍या कन्स्ट्रक्टरचा संदर्भ देण्याची पद्धत पास करू शकता:toArray(int[]::new);