Java 8 এ Lambda Expressions এবং Streams API পIntroduced, যা কোড লেখার পদ্ধতিকে আরও কার্যকর এবং সংক্ষিপ্ত করে তোলে। Lambda expressions ব্যবহার করে, আপনি functional programming ধারণা Java তে প্রয়োগ করতে পারেন, এবং Regex এর সাথে একত্রে ব্যবহার করে আপনি আরও সংক্ষিপ্ত এবং কার্যকরী কোড তৈরি করতে পারেন।
এখানে আমরা Lambda Expressions এবং Regex এর Integration কিভাবে করা যায়, তা দেখব।
1. Lambda Expressions Recap:
Lambda expression হল একটি ছোট আকারের ফাংশন যা method implementation ছাড়া প্যারামিটার গ্রহণ করে এবং একটি কার্যকরী মান ফেরত দেয়। এটি Functional Interface এর সাথে কাজ করে।
Syntax:
(parameters) -> expression
উদাহরণ:
(int x, int y) -> x + y
এটি একটি Functional Interface এর মেথড apply(int x, int y) কে বাস্তবায়িত করবে।
2. Regex এবং Lambda Integration
Regex ব্যবহার করে আপনি স্ট্রিং ম্যানিপুলেশন, ফিল্টারিং, এবং প্যাটার্ন ম্যাচিং কাজ করতে পারেন, এবং যখন আপনি Lambda expressions এর সাথে এটি ইন্টিগ্রেট করেন, তখন আপনি আরও দ্রুত এবং সংক্ষিপ্ত কোড লিখতে পারবেন।
Lambda Expressions ব্যবহার করে Regex Matching
Lambda expressions ব্যবহার করে স্ট্রিংয়ের মধ্যে regex matching করতে পারে, যেটি প্রথাগত loop বা for-each এর তুলনায় সংক্ষিপ্ত এবং পরিষ্কার। এখানে দেখানো হলো কীভাবে Streams API এবং Lambda expressions এর সাথে Regex ব্যবহার করা যায়।
উদাহরণ:
ধরা যাক, আমাদের একটি List of Strings আছে এবং আমরা সেই স্ট্রিংগুলির মধ্যে শুধুমাত্র যেগুলো একটি নির্দিষ্ট regex pattern মেলে তা ফিল্টার করতে চাই।
import java.util.*;
import java.util.regex.*;
import java.util.stream.*;
public class LambdaRegexExample {
public static void main(String[] args) {
List<String> strings = Arrays.asList("apple", "banana", "cherry", "apricot", "mango");
// Define regex pattern for words starting with 'a'
String pattern = "^a.*";
// Use Stream and Lambda Expression to filter strings
List<String> filteredStrings = strings.stream()
.filter(s -> s.matches(pattern)) // Lambda expression for regex matching
.collect(Collectors.toList());
// Print the filtered result
filteredStrings.forEach(System.out::println);
}
}
আউটপুট:
apple
apricot
ব্যাখ্যা:
- Lambda Expression:
s -> s.matches(pattern)এখানেmatches()method ব্যবহার করা হয়েছে যেটি Regex প্যাটার্নের সাথে স্ট্রিং ম্যাচিং চেক করে। এটি একটি functional interface হিসেবে কাজ করে এবং স্ট্রিং ফিল্টার করার জন্য ব্যবহার করা হয়েছে। - Stream API:
strings.stream()ব্যবহার করে স্ট্রিংগুলির একটি স্ট্রিম তৈরি করা হয়েছে এবং তারপর.filter()ব্যবহার করে শুধুমাত্র সেই স্ট্রিংগুলোকে ফিল্টার করা হয়েছে যেগুলোর সাথে regex প্যাটার্ন মেলে।
3. Regex Substitution with Lambda Expressions
একটি সাধারণ ব্যবহার হতে পারে regex substitution (অথবা রূপান্তর)। আমরা Lambda expression ব্যবহার করে স্ট্রিংয়ের মধ্যে substitution করতে পারি, যেখানে regex প্যাটার্নের মাধ্যমে এক বা একাধিক অংশ পরিবর্তন করা হবে।
উদাহরণ:
ধরা যাক, আমাদের একটি List of Strings রয়েছে এবং আমরা সমস্ত digits (সংখ্যা) গুলোকে একটি নির্দিষ্ট character দিয়ে প্রতিস্থাপন করতে চাই।
import java.util.*;
import java.util.regex.*;
import java.util.stream.*;
public class RegexSubstitutionLambda {
public static void main(String[] args) {
List<String> strings = Arrays.asList("hello123", "world456", "java789");
// Define regex pattern for digits
String pattern = "\\d+";
// Replace digits with '#' using Stream and Lambda
List<String> substitutedStrings = strings.stream()
.map(s -> s.replaceAll(pattern, "#")) // Lambda expression for substitution
.collect(Collectors.toList());
// Print the substituted result
substitutedStrings.forEach(System.out::println);
}
}
আউটপুট:
hello#
world#
java#
ব্যাখ্যা:
- Lambda Expression:
s -> s.replaceAll(pattern, "#")এখানেreplaceAll()মেথড ব্যবহার করা হয়েছে যা স্ট্রিংয়ের মধ্যে সংখ্যাগুলোকে#দিয়ে প্রতিস্থাপন করেছে। এটি Lambda expression এর মাধ্যমে প্রতিটি স্ট্রিংয়ের উপর প্রয়োগ করা হয়েছে। - Stream API: স্ট্রিম ব্যবহার করে একটি তালিকায় প্রতিটি স্ট্রিংয়ের উপর substitution করা হয়েছে এবং নতুন স্ট্রিংয়ের তালিকা তৈরি করা হয়েছে।
4. Using Regex with Complex Lambda Expressions
এখন একটি আরও উন্নত উদাহরণ দেখি যেখানে আমরা stream এবং regex এর সাথে আরও জটিল Lambda expressions ব্যবহার করি।
উদাহরণ: যদি আমরা এমন একটি List of Strings থেকে শুধুমাত্র সেগুলো নির্বাচন করতে চাই যা একটি নির্দিষ্ট প্যাটার্নের মধ্যে থাকে এবং তারপর তাদের uppercase করে দিতে চাই।
import java.util.*;
import java.util.regex.*;
import java.util.stream.*;
public class ComplexLambdaRegexExample {
public static void main(String[] args) {
List<String> strings = Arrays.asList("apple123", "banana456", "apricot789", "grape101");
// Define regex pattern for strings containing digits
String pattern = ".*\\d+.*";
// Use Stream, Lambda Expression, and Regex to filter and transform
List<String> transformedStrings = strings.stream()
.filter(s -> s.matches(pattern)) // Filter strings with digits using regex
.map(s -> s.toUpperCase()) // Convert matched strings to uppercase
.collect(Collectors.toList());
// Print the transformed result
transformedStrings.forEach(System.out::println);
}
}
আউটপুট:
APPLE123
BANANA456
APRICOT789
GRAPE101
ব্যাখ্যা:
- Lambda Expression:
s -> s.matches(pattern)এবংs -> s.toUpperCase()—এখানে প্রথমে regex matching এর মাধ্যমে সঠিক স্ট্রিং নির্বাচন করা হয়েছে এবং তারপর uppercase রূপান্তর করা হয়েছে। - Stream API:
.filter()মেথডটি regex প্যাটার্নের সাথে মিলে এমন স্ট্রিং ফিল্টার করে এবং.map()মেথডটি প্রত্যেকটি স্ট্রিংকে uppercase রূপে রূপান্তর করে।
5. Performance Considerations
Performance Tips for Lambda and Regex:
- Avoid Repeated Regex Compilation: প্রতিবার Regex প্যাটার্ন কম্পাইল করার পরিবর্তে, একবার
Pattern.compile()ব্যবহার করুন এবং তারপর ব্যবহার করুন। এটি Regex প্যাটার্নের কম্পাইল করার খরচ কমাবে। - Use Efficient Patterns: Regex প্যাটার্নগুলি যতটা সম্ভব কার্যকর এবং সুনির্দিষ্ট হতে হবে। যেমন, যত কম ক্যাপচারিং গ্রুপ ব্যবহার করা যাবে, ততই ভাল।
- Parallel Processing: স্ট্রিমের parallel processing ব্যবহার করে আপনি regex ম্যাচিং এর কাজকে অনেক দ্রুত করতে পারেন যদি ডেটার আকার বড় হয়। তবে, এটি ব্যবহার করার আগে পারফরম্যান্স টেস্টিং করা গুরুত্বপূর্ণ।
Lambda Expressions এবং Streams API এর সাথে Regex ইন্টিগ্রেট করে আপনি আরও সংক্ষিপ্ত, পরিষ্কার এবং কার্যকর কোড লিখতে পারেন। এই দুটি শক্তিশালী ফিচারের সংমিশ্রণ আপনার স্ট্রিং ম্যানিপুলেশন এবং প্যাটার্ন ম্যাচিংয়ের কাজকে দ্রুততর এবং আরও উন্নত করে তুলবে। তবে, performance optimization এর জন্য regex কম্পাইলেশন এবং প্যাটার্নের ব্যবহারের উপর নজর রাখা উচিত।
Read more