Java Reflection Package (java.lang.reflect) এবং Functional Interfaces (যেমন Predicate, Function, Consumer, Supplier) এর মাধ্যমে Regex ব্যবহারের ধারণা একটি অত্যন্ত শক্তিশালী কৌশল, যেখানে আপনি Functional Programming এবং Regex Matching কে একত্রিত করেন। এটি কোডের পুনঃব্যবহারযোগ্যতা এবং পরিষ্কারতাকে বাড়াতে সাহায্য করে, কারণ আপনি রেগুলার এক্সপ্রেশন (Regex) এবং ফাংশনাল ইন্টারফেস ব্যবহার করে বিভিন্ন স্ট্রিং ম্যানিপুলেশন বা প্যাটার্ন ম্যাচিং কার্যক্রমকে আরও সহজ এবং কার্যকরীভাবে বাস্তবায়িত করতে পারেন।
Functional Interfaces:
ফাংশনাল ইন্টারফেস এমন ইন্টারফেস যা শুধুমাত্র একটি অ্যাবস্ট্র্যাক্ট মেথড থাকে। Java-তে একটি Functional Interface ব্যবহার করা হয় যেসব ক্ষেত্রে আপনি lambda expressions বা method references ব্যবহার করতে চান। কিছু উদাহরণ হলো:
Predicate<T>: একটি বুলিয়ান মান প্রদান করে, যা সাধারণত একটি শর্ত চেক করার জন্য ব্যবহৃত হয়।Function<T, R>: একটি ইনপুট অ্যারগুমেন্ট গ্রহণ করে এবং একটি আউটপুট প্রদান করে।Consumer<T>: ইনপুট নেয় কিন্তু আউটপুট প্রদান করে না।
Regex এবং Functional Interfaces এর মধ্যে সম্পর্ক:
আপনি Functional Interfaces ব্যবহার করে Regex Matching করতে পারেন, যেমন:
Predicateদিয়ে আপনি স্ট্রিংয়ে নির্দিষ্ট প্যাটার্ন মিলছে কিনা তা চেক করতে পারেন।Functionদিয়ে স্ট্রিংয়ের উপর রেগুলার এক্সপ্রেশন প্রয়োগ করতে এবং ফলাফল রিটার্ন করতে পারেন।
Regex এবং Functional Interfaces এর উদাহরণ:
1. Predicate দিয়ে Regex Matching:
Predicate একটি ফাংশনাল ইন্টারফেস, যা একটি শর্ত নির্ধারণ করে এবং সে শর্তটি যদি পূর্ণ হয়, তবে true রিটার্ন করে।
এখানে আমরা Predicate ব্যবহার করে একটি স্ট্রিংয়ের মধ্যে একটি নির্দিষ্ট প্যাটার্ন যাচাই করব:
import java.util.function.Predicate;
import java.util.regex.*;
public class RegexWithPredicate {
public static void main(String[] args) {
// Regular expression to check if the string is a valid phone number
String phoneNumber = "+1-800-555-1234";
Predicate<String> isValidPhoneNumber = s -> s.matches("^\\+\\d{1,3}-\\d{1,4}-\\d{1,4}-\\d{1,4}$");
if (isValidPhoneNumber.test(phoneNumber)) {
System.out.println("Valid phone number: " + phoneNumber);
} else {
System.out.println("Invalid phone number: " + phoneNumber);
}
}
}
ব্যাখ্যা:
Predicate<String> isValidPhoneNumber: এখানে একটিPredicateব্যবহার করা হয়েছে যা স্ট্রিংটি একটি ফোন নম্বর ফরম্যাটের সাথে মেলে কিনা তা যাচাই করে।s.matches(...)পদ্ধতি ব্যবহার করে এটি রেগুলার এক্সপ্রেশন পরীক্ষা করছে।isValidPhoneNumber.test(phoneNumber):test()মেথডটি প্যাটার্নের সাথে স্ট্রিং মিলছে কিনা তা যাচাই করবে এবংtrueবাfalseরিটার্ন করবে।
আউটপুট:
Valid phone number: +1-800-555-1234
2. Function দিয়ে Regex ব্যবহার:
আপনি Function<T, R> ফাংশনাল ইন্টারফেস ব্যবহার করে একটি ইনপুট স্ট্রিং গ্রহণ করতে পারেন এবং রেগুলার এক্সপ্রেশন ব্যবহার করে আউটপুট ফলাফল প্রদান করতে পারেন। নিচে একটি উদাহরণ দেওয়া হলো যেখানে রেগুলার এক্সপ্রেশন দিয়ে একটি স্ট্রিংয়ের সমস্ত ডিজিট বের করা হচ্ছে।
import java.util.function.Function;
import java.util.regex.*;
public class RegexWithFunction {
public static void main(String[] args) {
// Regex to extract digits from a string
String input = "My phone number is 123-456-7890.";
Function<String, String> extractDigits = s -> {
Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher(s);
StringBuilder digits = new StringBuilder();
while (matcher.find()) {
digits.append(matcher.group());
}
return digits.toString();
};
String digits = extractDigits.apply(input);
System.out.println("Extracted digits: " + digits);
}
}
ব্যাখ্যা:
Function<String, String> extractDigits: এখানে একটিFunctionব্যবহার করা হয়েছে, যা স্ট্রিং ইনপুট গ্রহণ করে এবং রেগুলার এক্সপ্রেশন ব্যবহার করে সমস্ত ডিজিট বের করে।matcher.find(): এটি স্ট্রিং থেকে সমস্ত ডিজিট খুঁজে বের করে এবংgroup()মেথডের মাধ্যমে তা স্টোর করে।
আউটপুট:
Extracted digits: 1234567890
3. Consumer দিয়ে Regex ব্যবহার:
Consumer ফাংশনাল ইন্টারফেস একটি ইনপুট নেয় এবং কিছু অপারেশন সম্পাদন করে, তবে কোন রিটার্ন ভ্যালু দেয় না। এটি সাধারণত কিছু প্রভাব ফেলতে ব্যবহৃত হয়, যেমন লগিং, বা স্ট্রিং ম্যানিপুলেশন।
import java.util.function.Consumer;
import java.util.regex.*;
public class RegexWithConsumer {
public static void main(String[] args) {
// Regex to print out each match from a string
String input = "I have 2 apples and 3 oranges.";
Consumer<String> printMatches = s -> {
Pattern pattern = Pattern.compile("\\d+"); // Match digits
Matcher matcher = pattern.matcher(s);
while (matcher.find()) {
System.out.println("Found number: " + matcher.group());
}
};
// Apply the consumer to the input
printMatches.accept(input);
}
}
ব্যাখ্যা:
Consumer<String> printMatches: এটি একটিConsumerফাংশনাল ইন্টারফেস, যা স্ট্রিং ইনপুট নেয় এবং স্ট্রিংয়ের মধ্যে ডিজিট খুঁজে বের করে প্রিন্ট করে।matcher.find(): এটি স্ট্রিং থেকে সমস্ত ডিজিট খুঁজে বের করে এবংgroup()মেথডের মাধ্যমে তা প্রিন্ট করে।
আউটপুট:
Found number: 2
Found number: 3
- Functional Interfaces এবং Regex একত্রে ব্যবহার করে আপনি জটিল স্ট্রিং ম্যানিপুলেশন এবং প্যাটার্ন ম্যাচিং আরও সহজ, পরিষ্কার এবং কার্যকরভাবে করতে পারেন।
Predicateব্যবহার করে আপনি স্ট্রিংয়ের সাথে প্যাটার্ন ম্যাচিং করতে পারেন এবং একটি শর্ত চেক করতে পারেন।Functionব্যবহার করে আপনি স্ট্রিং ইনপুট নিয়ে কিছু রেগুলার এক্সপ্রেশন প্রক্রিয়া করতে পারেন এবং ফলাফল আউটপুট হিসেবে ফিরিয়ে দিতে পারেন।Consumerব্যবহার করে আপনি স্ট্রিংয়ের উপর কোনো কার্য সম্পাদন করতে পারেন, যেমন প্যাটার্ন খুঁজে বের করা এবং তা প্রিন্ট করা।
ফাংশনাল ইন্টারফেস এবং রেগুলার এক্সপ্রেশন ব্যবহার করে আপনি কোডটিকে আরও কমপ্যাক্ট এবং রক্ষণাবেক্ষণযোগ্য করতে পারবেন।
Read more