Java 8 এ ল্যাম্বডা এক্সপ্রেশন (Lambda Expressions) পরিচিতি পেয়েছে, যা কোডকে আরও সংক্ষিপ্ত এবং পাঠযোগ্য করে তোলে, বিশেষ করে ফাংশনাল ইন্টারফেসের সাথে কাজ করার সময়। ল্যাম্বডা এক্সপ্রেশন হল একটি স্পষ্ট এবং সংক্ষিপ্ত উপায়, যেটি একটি পদ্ধতি (Method) কে অভিব্যক্তি (Expression) হিসেবে প্রকাশ করে।
ল্যাম্বডা এক্সপ্রেশন মূলত ব্যবহৃত হয় যখন আপনি এমন একটি পদ্ধতি বা ফাংশন তৈরি করতে চান, যেটি অন্য একটি পদ্ধতি বা ফাংশনের আর্গুমেন্ট হিসেবে পাস করা যাবে বা এটি অন্য পদ্ধতির মাধ্যমে কার্যকর হবে।
ল্যাম্বডা এক্সপ্রেশনের সিনট্যাক্স:
ল্যাম্বডা এক্সপ্রেশনের সিনট্যাক্স হলো:
(parameter) -> expression
এখানে:
parameter: পদ্ধতির ইনপুট প্যারামিটার।->: ল্যাম্বডা অপারেটর, যা প্যারামিটার এবং পদ্ধতির শরীরকে আলাদা করে।expression: পদ্ধতির কার্যকারিতা বা বাস্তবায়ন।
উদাহরণ ১: সাধারণ ল্যাম্বডা এক্সপ্রেশন
এটি একটি সহজ উদাহরণ যেখানে আমরা Runnable ইন্টারফেসের মাধ্যমে একটি থ্রেড তৈরি করছি ল্যাম্বডা এক্সপ্রেশন ব্যবহার করে।
public class LambdaExample {
public static void main(String[] args) {
// ল্যাম্বডা এক্সপ্রেশন দিয়ে থ্রেড তৈরি
Thread thread = new Thread(() -> {
System.out.println("ল্যাম্বডা এক্সপ্রেশন থেকে শুভেচ্ছা!");
});
thread.start(); // থ্রেড শুরু করা
}
}
ব্যাখ্যা:
- এখানে আমরা একটি নতুন
Threadঅবজেক্ট তৈরি করেছি এবং এর কন্সট্রাক্টরে একটি ল্যাম্বডা এক্সপ্রেশন পাস করেছি। - ল্যাম্বডা এক্সপ্রেশন
() -> { System.out.println("ল্যাম্বডা এক্সপ্রেশন থেকে শুভেচ্ছা!"); }run()পদ্ধতিকে বাস্তবায়ন করছে, যা থ্রেড চালু হলে একটি বার্তা কনসোলে প্রিন্ট করে।
উদাহরণ ২: প্যারামিটার সহ ল্যাম্বডা এক্সপ্রেশন
এবার আমরা দেখবো কিভাবে ল্যাম্বডা এক্সপ্রেশন প্যারামিটার ব্যবহার করতে পারে। এখানে, আমরা Comparator ইন্টারফেস ব্যবহার করে একটি স্ট্রিংয়ের তালিকা সজ্জিত (sort) করছি।
import java.util.*;
public class LambdaExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("John", "Alice", "Bob", "David");
// ল্যাম্বডা এক্সপ্রেশন দিয়ে সজ্জিত করা
Collections.sort(names, (name1, name2) -> name1.compareTo(name2));
// সজ্জিত তালিকা প্রিন্ট করা
names.forEach(name -> System.out.println(name));
}
}
ব্যাখ্যা:
Collections.sort()মেথড একটিComparatorইন্টারফেস নেয়, যার মাধ্যমে আমরা সজ্জিত করার লজিক প্রদান করি।- আমরা একটি ল্যাম্বডা এক্সপ্রেশন
(name1, name2) -> name1.compareTo(name2)পাস করেছি, যা দুটি স্ট্রিংকে তুলনা করে তাদের সাজিয়ে দেয়। forEachমেথডের মাধ্যমে ল্যাম্বডা এক্সপ্রেশনname -> System.out.println(name)ব্যবহার করে তালিকার প্রতিটি নাম প্রিন্ট করা হয়।
উদাহরণ ৩: রিটার্ন ভ্যালু সহ ল্যাম্বডা এক্সপ্রেশন
ল্যাম্বডা এক্সপ্রেশন রিটার্ন ভ্যালুও প্রদান করতে পারে। এখানে, আমরা একটি Function ইন্টারফেস ব্যবহার করে একটি সংখ্যার বর্গ (square) বের করছি।
import java.util.function.Function;
public class LambdaExample {
public static void main(String[] args) {
// ল্যাম্বডা এক্সপ্রেশন দিয়ে সংখ্যার বর্গ বের করা
Function<Integer, Integer> square = (x) -> x * x;
// ল্যাম্বডা এক্সপ্রেশন প্রয়োগ
System.out.println("৫ এর বর্গ: " + square.apply(5)); // আউটপুট: ২৫
System.out.println("১০ এর বর্গ: " + square.apply(10)); // আউটপুট: ১০০
}
}
ব্যাখ্যা:
- এখানে আমরা একটি
Function<Integer, Integer>ডিফাইন করেছি, যা একটি সংখ্যার বর্গ বের করে। - ল্যাম্বডা এক্সপ্রেশন
(x) -> x * xএকটি পূর্ণসংখ্যাxগ্রহণ করে এবং তার বর্গx * xরিটার্ন করে। apply()মেথডের মাধ্যমে এই ল্যাম্বডা এক্সপ্রেশন প্রয়োগ করা হয়।
উদাহরণ ৪: একাধিক স্টেটমেন্ট সহ ল্যাম্বডা এক্সপ্রেশন
ল্যাম্বডা এক্সপ্রেশন একাধিক স্টেটমেন্টও ধারণ করতে পারে। এখানে, আমরা একটি তালিকা থেকে শুধু বিপরীত সংখ্যা (even numbers) ফিল্টার করছি এবং তাদের প্রিন্ট করছি।
import java.util.*;
public class LambdaExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// ল্যাম্বডা এক্সপ্রেশন দিয়ে শুধুমাত্র বিপরীত সংখ্যা বের করা
numbers.stream()
.filter(n -> {
if (n % 2 == 0) {
return true;
}
return false;
})
.forEach(n -> System.out.println(n)); // আউটপুট: ২, ৪, ৬, ৮, ১০
}
}
ব্যাখ্যা:
- এখানে আমরা
stream()ব্যবহার করে একটি স্ট্রীম তৈরি করেছি। filter()মেথডের মধ্যে একটি ল্যাম্বডা এক্সপ্রেশন দেওয়া হয়েছে যা শুধুমাত্র বিপরীত (even) সংখ্যাগুলোকে রাখে।forEach()মেথডের মাধ্যমে ল্যাম্বডা এক্সপ্রেশনn -> System.out.println(n)ব্যবহার করে প্রতিটি বিপরীত সংখ্যা প্রিন্ট করা হয়।
উদাহরণ ৫: কাস্টম ফাংশনাল ইন্টারফেস সহ ল্যাম্বডা এক্সপ্রেশন
আমরা কাস্টম ফাংশনাল ইন্টারফেস তৈরি করতে পারি এবং সেটি ব্যবহার করে ল্যাম্বডা এক্সপ্রেশন প্রয়োগ করতে পারি।
// কাস্টম ফাংশনাল ইন্টারফেস
@FunctionalInterface
interface MyFunction {
int operation(int a, int b);
}
public class LambdaExample {
public static void main(String[] args) {
// ল্যাম্বডা এক্সপ্রেশন দিয়ে 'operation' পদ্ধতি বাস্তবায়ন
MyFunction add = (a, b) -> a + b;
MyFunction multiply = (a, b) -> a * b;
// অপারেশন প্রয়োগ
System.out.println("যোগফল: " + add.operation(5, 3)); // আউটপুট: ৮
System.out.println("গুণফল: " + multiply.operation(5, 3)); // আউটপুট: ১৫
}
}
ব্যাখ্যা:
- আমরা একটি কাস্টম ফাংশনাল ইন্টারফেস
MyFunctionডিফাইন করেছি, যার একটিoperation()মেথড আছে। - ল্যাম্বডা এক্সপ্রেশন
a, b -> a + bএবংa, b -> a * bদিয়ে দুটি অপারেশন (যোগ এবং গুণ) বাস্তবায়ন করেছি।
ল্যাম্বডা এক্সপ্রেশন এর সুবিধা:
- সংক্ষিপ্ত কোড: ল্যাম্বডা এক্সপ্রেশন কোডকে আরও সংক্ষিপ্ত এবং পাঠযোগ্য করে তোলে।
- ফাংশনাল প্রোগ্রামিং সমর্থন: ল্যাম্বডা এক্সপ্রেশন আপনাকে ফাংশনাল প্রোগ্রামিং কনসেপ্ট বাস্তবায়ন করতে সাহায্য করে, যেমন আচরণ প্যারামিটার হিসেবে পাস করা।
- প্যারালাল প্রসেসিং সমর্থন:
Stream APIএবং ল্যাম্বডা এক্সপ্রেশন ব্যবহার করে সংগ্রহ (collections) প্যারালালভাবে প্রসেস করা সহজ হয়। - কোডের পাঠযোগ্যতা: ল্যাম্বডা এক্সপ্রেশন কোডের পাঠযোগ্যতা বাড়ায় এবং বয়লারপ্লেট কোড কমিয়ে আনে।
Java 8 এর ল্যাম্বডা এক্সপ্রেশন একটি শক্তিশালী টুল যা Java কোডকে আরও সংক্ষিপ্ত, পরিষ্কার এবং কার্যকরী করে তোলে। এটি ফাংশনাল প্রোগ্রামিং ধারণা বাস্তবায়ন করার মাধ্যমে Java-তে আরও নতুন কৌশল এবং ফিচার ব্যবহার করার সুযোগ দেয়।
Read more