Java Functional Programming ফাংশনাল প্রোগ্রামিং (FP) ধারণাকে জাভাতে প্রয়োগ করার প্রক্রিয়া। এটি functional-style programming এর একটি উপায় যা প্রোগ্রামের কার্যকারিতা আরও সংক্ষিপ্ত, পরিষ্কার এবং রিডেবল করে তোলে। জাভাতে Lambda Expressions একধরনের ফাংশনাল প্রোগ্রামিং ধারণা, যা Java 8 তে আনা হয়।
Lambda Expressions হল এমন একটি উপায় যা ফাংশনাল প্রোগ্রামিং পারাদিগমের সাথে সঙ্গতিপূর্ণ, যা কোড কমপ্যাক্ট, সিম্পল এবং রিডেবল করতে সহায়ক।
১. Lambda Expressions কি?
Lambda Expression হল একটি ছোট, অজানা ফাংশন যা এক বা একাধিক আর্গুমেন্ট গ্রহণ করে এবং কিছু কাজ করে। ল্যাম্বডা এক্সপ্রেশন ব্যবহার করে আপনি একটি ফাংশন তৈরি করতে পারেন যা অন্য ফাংশনের আর্গুমেন্ট হিসেবে পাস করা যায় বা ফিরে আসে।
জাভাতে, একটি ল্যাম্বডা এক্সপ্রেশন সাধারণত functional interfaces (যেগুলির একমাত্র একটি抽象 মেথড থাকে) এর সাথে ব্যবহৃত হয়। এর সাহায্যে আপনি কোডের জটিলতা কমাতে পারেন এবং সিম্পল ও ক্লিন কোড তৈরি করতে পারেন।
২. Lambda Expression এর Sintax
Lambda expression এর সাধারণ সিনট্যাক্স:
(parameters) -> expression
এখানে:
- parameters: ফাংশন আর্গুমেন্ট (যেমন
int a, int b). - ->: ল্যাম্বডা অপারেটর।
- expression: এক্সপ্রেশন বা কোড ব্লক যা ফাংশনটির কার্যাবলি বাস্তবায়ন করে।
উদাহরণ ১: Lambda Expression এর সাধারণ ব্যবহার
// Traditional way using anonymous class
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println("Hello, World!");
}
};
// Lambda expression for the same functionality
Runnable r2 = () -> System.out.println("Hello, World!");
এখানে, Runnable ইন্টারফেসে একটি run() মেথড আছে। প্রথমে এটি anonymous class ব্যবহার করে তৈরি করা হয়েছে, এবং পরবর্তীতে lambda expression ব্যবহার করে কোডটি অনেক সহজ এবং সংক্ষিপ্ত করা হয়েছে।
উদাহরণ ২: Two Parameters with Lambda Expression
// Lambda expression with two parameters
BiFunction<Integer, Integer, Integer> add = (a, b) -> a + b;
System.out.println(add.apply(10, 20)); // Output: 30
এখানে, BiFunction একটি ফাংশনাল ইন্টারফেস যা দুটি আর্গুমেন্ট নেয় এবং একটি রিটার্ন ভ্যালু প্রদান করে। ল্যাম্বডা এক্সপ্রেশন (a, b) -> a + b এর মাধ্যমে দুইটি ইনপুট সংখ্যার যোগফল বের করা হয়েছে।
৩. Lambda Expressions এর সুবিধা
- Compact Code: ল্যাম্বডা এক্সপ্রেশন কোডকে কমপ্যাক্ট এবং রিডেবল করে তোলে। বিশেষত যখন আপনি ছোট-ছোট ফাংশন বা ক্যালব্যাক পাস করতে চান।
- Readable: কোডের রিডেবিলিটি বৃদ্ধি পায়, কারণ আপনি অনেক কোড ডুপ্লিকেশন দূর করতে পারেন।
- Higher-Order Functions: ল্যাম্বডা এক্সপ্রেশন ফাংশনাল প্যারামিটার হিসেবে পাস করা যেতে পারে, যা ফাংশনাল প্রোগ্রামিং এর প্রধান বৈশিষ্ট্য।
- Parallel Processing: ল্যাম্বডা এক্সপ্রেশন ব্যবহার করে কোডকে streams এর সাথে যুক্ত করে সহজেই parallel processing করা যেতে পারে।
৪. Functional Interfaces
ল্যাম্বডা এক্সপ্রেশন শুধুমাত্র Functional Interfaces এর সাথে কাজ করে। একটি Functional Interface হল এমন একটি ইন্টারফেস যার মধ্যে শুধুমাত্র একটিমাত্র抽象 মেথড থাকে। @FunctionalInterface অ্যানোটেশন দিয়ে এটি স্পষ্টভাবে চিহ্নিত করা যায়।
উদাহরণ ৩: Functional Interface
@FunctionalInterface
interface MyFunctionalInterface {
void printMessage(String message); // Single abstract method
}
এই ইন্টারফেসের মধ্যে একটি মাত্র抽象 মেথড printMessage আছে, যা Lambda Expression দ্বারা ইমপ্লিমেন্ট করা যাবে।
উদাহরণ ৪: Lambda Expression with Functional Interface
@FunctionalInterface
interface MyFunctionalInterface {
void printMessage(String message);
}
public class LambdaExample {
public static void main(String[] args) {
// Using Lambda Expression
MyFunctionalInterface myFunc = (message) -> System.out.println(message);
myFunc.printMessage("Hello from Lambda Expression!");
}
}
এখানে, printMessage মেথডের কার্যাবলি একটি ল্যাম্বডা এক্সপ্রেশন (message) -> System.out.println(message) এর মাধ্যমে বাস্তবায়ন করা হয়েছে।
৫. Lambda Expression with Collections and Streams
Java 8 এ Streams API চালু করা হয়, যার মাধ্যমে Lambda Expressions ব্যবহার করে collections (যেমন List, Set) থেকে ডেটা প্রক্রিয়া করা যায়। এটি filter, map, reduce ইত্যাদি অপারেশনগুলির সাহায্যে অত্যন্ত শক্তিশালী ডেটা প্রক্রিয়া করার সুযোগ দেয়।
উদাহরণ ৫: Lambda Expressions with Streams
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class LambdaStreamExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// Filter even numbers and collect them into a list
List<Integer> evenNumbers = numbers.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
System.out.println(evenNumbers); // Output: [2, 4, 6, 8, 10]
}
}
এখানে, filter মেথডের মাধ্যমে Lambda Expression (n -> n % 2 == 0) ব্যবহার করে এমন সংখ্যা গুলি সিলেক্ট করা হয়েছে যা even (যুগল সংখ্যা)।
উদাহরণ ৬: Lambda Expressions with Map Operation
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class LambdaMapExample {
public static void main(String[] args) {
List<String> words = Arrays.asList("apple", "banana", "cherry");
// Convert all words to uppercase using map and lambda expression
List<String> upperCaseWords = words.stream()
.map(word -> word.toUpperCase())
.collect(Collectors.toList());
System.out.println(upperCaseWords); // Output: [APPLE, BANANA, CHERRY]
}
}
এখানে, map অপারেশনের মাধ্যমে প্রতিটি শব্দকে toUpperCase করতে Lambda Expression ব্যবহার করা হয়েছে।
৬. Method References with Lambda Expressions
Method References হল Lambda Expressions এর একটি সংক্ষিপ্ত এবং পরিষ্কার সংস্করণ। এটি একটি ফাংশনকে সরাসরি পয়েন্টার করে (বাধ্যতামূলক না থাকলে ল্যাম্বডা এক্সপ্রেশন লেখার চেয়ে সহজ)।
উদাহরণ ৭: Method Reference with Lambda Expression
import java.util.Arrays;
import java.util.List;
public class MethodReferenceExample {
public static void main(String[] args) {
List<String> words = Arrays.asList("apple", "banana", "cherry");
// Lambda expression
words.forEach(word -> System.out.println(word));
// Method reference
words.forEach(System.out::println);
}
}
এখানে, System.out::println একটি method reference যা ল্যাম্বডা এক্সপ্রেশনের পরিবর্তে ব্যবহৃত হয়েছে। এটি একই কার্যাবলি সম্পাদন করে, তবে কোডটি আরও পরিষ্কার এবং সংক্ষিপ্ত হয়।
সারাংশ
Lambda Expressions Java 8 এ পরিচিত একটি ফিচার যা ফাংশনাল প্রোগ্রামিং ধারণাকে Java-তে ব্যবহারযোগ্য করে তোলে। এটি কোডকে আরও সংক্ষিপ্ত, পরিষ্কার এবং রিডেবল করতে সহায়ক। Lambda Expressions এর মাধ্যমে আপনি কমপ্যাক্ট কোড লেখতে পারেন এবং সহজে functional interfaces, streams, এবং collections এর সাথে কাজ করতে পারেন। Spring Framework, JavaFX, এবং অন্যান্য API-তে Lambda Expressions খুবই কার্যকরী, বিশেষ করে যেখানে ফাংশনাল স্টাইলের কোড লেখা হয়।
Read more