Wednesday, April 19, 2017

ল্যামডা এক্সপ্রেশনঃ পর্ব দুই (Lambda Expression: Part 2)

আগে পর্বে জাভাতে ল্যামডা এক্সপ্রেশন কী এবং কীভাবে ব্যবহার করা হয় তার একটি প্রস্তাবনা দেওয়া হয়েছে। এবার আরও ভেতরে প্রবেশ করা যাক-

খুব সহজে করে সংজ্ঞায়িত করা যায় এভাবে - ল্যামডা এক্সপ্রেশন হলো অ্যানোনিমাস ফাংশন যা অন্য মেথডে আর্গুমেন্ট হিসেবে পাস করা যায় বা ভ্যারিয়েবলে অ্যাসাইন করা যায়। 

আমরা সংজ্ঞা থেকে এর তিনটি বৈশিষ্ট্যকে আলাদা করতে পারি -

১. অ্যানোনিমাস- এদের নাম নেই। 
২. ফাংশন- এটিতে মেথডের মতো প্যারামিটার লিস্ট থাকে, রিটার্ন টাইপ থাকে এবং এক্সেপশন লিস্ট থাকতে পারে। তবে যেহেতু এগুলো কোনো ক্লাসের সাথে সংযুক্ত নয় তাই এগুলোকে ফাংশন বলা হয়। 
৩. পাসড অ্যারাউন্ড- এগুলোকে কোনো মেথডের আর্গুমেন্ট হিসেবে পাস করা যায় বা ভ্যারিয়েবলে অ্যাসাইন করা যায়। 

তবে ল্যামডা এক্সপ্রেশনের আরকটি বৈশিষ্ট্য হলো, সংক্ষিপ্ত। এতে অনেক কম লাইন কোড লিখে একই কাজ করা যায়। এতে বয়লারপ্লেট কোড কম থাকে। 

এবার ল্যামডা এক্সপ্রেশনের সিনট্যাক্স দেখা যাক। ল্যামডা এক্সপ্রেশনের তিনটি অংশ থাকে- 

১. প্যারামিটার লিস্ট- এতে শুরুতে কতগুলো প্যারামিটার থাকে। প্যরামিটারগুলোতে টাইপ থাকতে পারে। তবে অনেক্ষেত্রেই টাইপ ইনফরমেশন দেওয়ার প্রয়োজন পরে না। কম্পাইলার বুঝে নিতে পারে। একাধিক প্যরিমিটার থাকলে এগলোকে কমা দিয়ে আলাদা করতে হয় এবং প্যারামিটারগুলো একটি প্যারেন্থেসিসের মধ্যে থাকে। তবে একটি প্যারামিটার থাকলে প্যারেন্থেসিস দেওয়ার প্রয়োজন হয় না। 
২. অ্যারো সাইন - অ্যারো ( -> ) সাইন প্যারামিটার লিস্টকে বডি থেকে আলাদা করে। এটি দুটি ক্যারেক্টার (-) ড্যাশ ও (>) রাইট অ্যাঙ্গেল ব্রাকেট সংযুক্ত করে লেখা হয়। 
৩. বডি - যেখানে মূল কোড অংশটুকু থাকে।

কতগুলো উদাহরণ দেখা যাক - 

1
2
3
(Contact contact1, Contact contact2) -> {
          return contact1.getName().compareTo(contact2.getName());
};

তবে একে সংক্ষিপ্ত করে এক লাইনেও লেখা যায়- 

1
(Contact contact1, Contact contact2) -> contact1.getName().compareTo(contact2.getName());

একে ভ্যারিয়েবলে অ্যাসাইন করা যায়- 

1
Comparator contactComparator = (Contact contact1, Contact contact2) -> contact1.getName().compareTo(contact2.getName());

আরও কয়েকটি উদাহরণ- 


1
2
3
(String s) -> {
        return s.toUpperCase();
}

তবে একে সংক্ষি্প্ত করে লিখলে -


1
(String s) -> s.toUpperCase()

সুতরাং ল্যামডা এক্ষপ্রেশন দু রকম হতে পারে -

(parameters) → expression

অথবা 

(parameters) → {statements;}

বডিতে একাধিক স্ট্যাটমেন্ট থাকলে কার্লি ব্রেসের প্রয়োজন হয়।