1. ফাংশন পদ্ধতি
যদি একটি ইন্টারফেসে শুধুমাত্র একটি পদ্ধতি থাকে , তাহলে সেই ইন্টারফেসের প্রকারের একটি পরিবর্তনশীলকে ল্যাম্বডা এক্সপ্রেশন (ল্যাম্বডা ফাংশন) দ্বারা প্রদত্ত একটি মান নির্ধারণ করা যেতে পারে। এই ধরনের ইন্টারফেসগুলি কার্যকরী ইন্টারফেস হিসাবে পরিচিত হয়ে ওঠে (জাভা ল্যাম্বডা ফাংশনের জন্য সমর্থন যোগ করার পরে)।
উদাহরণস্বরূপ, জাভা Consumer<Type>
ইন্টারফেস আছে, যার accept(Type obj)
পদ্ধতি আছে। কেন এই ইন্টারফেস প্রয়োজন?
জাভা 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::method
x -> class.method(x);
একটি কনস্ট্রাক্টরের রেফারেন্স
একটি কনস্ট্রাক্টর একটি স্ট্যাটিক ক্লাস পদ্ধতির অনুরূপ আচরণ করে, তাই আপনি একটি কনস্ট্রাক্টরের একটি রেফারেন্সও পাস করতে পারেন। এটি এইভাবে দেখায়: .class::new
উদাহরণস্বরূপ, আপনি সংগ্রহের জন্য টাইপ ইরেজার পেতে পারেন এবং toArray()
পদ্ধতিটি একটি কনস্ট্রাক্টরের কাছে একটি রেফারেন্স পাস করতে পারেন যা পছন্দসই অ্যারে তৈরি করবে:toArray(int[]::new);
GO TO FULL VERSION