Streams API হল Java 8 এ একটি নতুন বৈশিষ্ট্য যা ফাংশনাল প্রোগ্রামিং ধারণা ভিত্তিক ডেটা প্রসেসিংকে সহজ করে তোলে। এটি java.util.stream প্যাকেজে অন্তর্ভুক্ত এবং এটি একটি ধারা (stream) হিসেবে ডেটা প্রসেসিং এবং ম্যানিপুলেশন করার জন্য একটি আধুনিক এবং কার্যকর উপায় প্রদান করে। Streams API এর সাহায্যে আপনি ডেটাকে ফিল্টার, ম্যাপ, সোর্ট, রিডিউস, ফ্ল্যাটম্যাপ, এবং অন্যান্য বিভিন্ন ধরনের ক্রিয়াকলাপ করতে পারেন, সবগুলো লাইনগুলিতে রৈখিকভাবে কাজ করা হয়।
Streams API এর কাজ:
Streams API মূলত একটি ডেটা সিকোয়েন্স বা সিরিজের উপর অপারেশন কার্যকর করতে ব্যবহৃত হয়, যেখানে আপনি কোলেকশন, অ্যারে, বা অন্য কোন ডেটা সঞ্চয় মাধ্যম থেকে ডেটা প্রসেস করতে পারেন। এটি অত্যন্ত পারফর্ম্যান্ট এবং কনকারেন্ট অপারেশন করতে সহায়ক, যেহেতু এটি প্যারালাল প্রসেসিংয়ের সমর্থনও প্রদান করে।
Streams API এর প্রধান কাজ:
- ডেটা প্রসেসিং: এটি আপনার ডেটাকে সহজে প্রসেস করতে সাহায্য করে, যেমন ফিল্টারিং, ম্যাপিং, সোর্টিং, বা রিডিউসিং।
- ফাংশনাল প্যারাডাইম: Streams API ফাংশনাল প্রোগ্রামিং এর ধারণাগুলিকে সমর্থন করে যেমন Lambda Expressions এবং Functional Interfaces।
- লেজি ইভ্যালুয়েশন (Lazy Evaluation): Streams API লেজি বা অলসভাবে কাজ করে, অর্থাৎ অপারেশনগুলো তখনই কার্যকর হয় যখন তারা বাস্তবেই প্রয়োজন হয়। এটি কার্যকরী এবং স্মার্ট প্রসেসিং উপায়।
- প্যারালাল প্রসেসিং (Parallel Processing): Streams API প্যারালাল স্ট্রিম (parallel streams) সমর্থন করে, যা ডেটা প্রসেসিংয়ের গতি বৃদ্ধি করে।
Streams API এর প্রধান উপাদানগুলো:
- Stream Interface:
- Stream হলো একটি ফাংশনাল ইন্টারফেস যা বিভিন্ন অপারেশন (যেমন filter, map, reduce, collect) সমর্থন করে।
- এটি দুই ধরনের স্ট্রিম পদ্ধতি সমর্থন করে:
- Sequential Streams: একটি একক থ্রেডে কাজ করে।
- Parallel Streams: একাধিক থ্রেডে কাজ করে, ফলে ডেটা প্রসেসিং দ্রুততর হয়।
- Key Methods in Stream Interface:
- filter(): একটি কন্ডিশন অনুযায়ী স্ট্রিম থেকে আইটেম ফিল্টার করতে ব্যবহৃত হয়।
- map(): ডেটার প্রতিটি আইটেমের উপর একটি ফাংশন প্রয়োগ করে নতুন ডেটা স্ট্রিম তৈরি করা।
- reduce(): ডেটার স্ট্রিমের উপরে একটি একক মান তৈরি করার জন্য এক্সেসর হিসাবে কাজ করে।
- forEach(): প্রতিটি আইটেমের উপর একটি অপারেশন চালায়।
- collect(): স্ট্রিমের সব আইটেম একটি সংগ্রহে (যেমন List, Set) পরিণত করতে ব্যবহৃত হয়।
- Stream Pipelines:
Streams API একাধিক স্ট্রিম অপারেশনকে পাইপলাইন হিসেবে একত্রিত করতে পারে। আপনি একাধিক স্ট্রিম অপারেশন একত্রে লিখতে পারেন, যেমন:
List<String> names = Arrays.asList("John", "Jane", "Adam", "Eve", "Alice"); List<String> result = names.stream() .filter(name -> name.startsWith("J")) // Filter out names that start with "J" .map(String::toUpperCase) // Convert to uppercase .collect(Collectors.toList()); // Collect the result into a list System.out.println(result); // Output: [JOHN, JANE]
- Intermediate vs Terminal Operations:
- Intermediate Operations: These are operations that transform a stream into another stream (e.g.,
filter(),map()). They are lazy and don’t execute until a terminal operation is invoked. - Terminal Operations: These operations trigger the processing of the stream (e.g.,
collect(),forEach(),reduce()).
- Intermediate Operations: These are operations that transform a stream into another stream (e.g.,
Streams API এর উপকারিতা:
- কোডের সরলীকরণ (Simplified Code):
- Streams API কম কোডের মাধ্যমে আরও কার্যকরী ডেটা প্রসেসিং করতে সহায়তা করে। ফিল্টার, ম্যাপ এবং রিডিউস অপারেশনগুলি কম লাইনে কোডে করা যায়।
- প্যারালাল প্রসেসিং সমর্থন:
- Parallel streams ব্যবহার করে একই সময় একাধিক থ্রেডে ডেটা প্রসেস করা যায়, যা বড় ডেটাসেটের ক্ষেত্রে পারফরম্যান্স উন্নত করে।
- লেজি ইভ্যালুয়েশন (Lazy Evaluation):
- স্ট্রিম অপারেশনগুলো অলসভাবে কাজ করে, অর্থাৎ অপারেশনগুলো তখনই কার্যকর হয় যখন একটি টার্মিনাল অপারেশন চালানো হয়। এতে প্রোগ্রাম কার্যকরী ও দ্রুত হয়।
- ফাংশনাল প্রোগ্রামিং ধারণা:
- Lambda expressions এবং functional interfaces এর মাধ্যমে ফাংশনাল প্রোগ্রামিং ধারণাগুলি সহজে ব্যবহার করা যায়।
Streams API এর কিছু উদাহরণ:
- Filter Example:
শুধুমাত্র 5 এর চেয়ে বড় সংখ্যাগুলি ফিল্টার করা:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); List<Integer> filtered = numbers.stream() .filter(n -> n > 5) .collect(Collectors.toList()); System.out.println(filtered); // Output: [6, 7, 8, 9, 10]
- Map Example:
একটি লিস্টের সব নাম বড় হাতের অক্ষরে রূপান্তর করা:
List<String> names = Arrays.asList("john", "jane", "adam"); List<String> upperCaseNames = names.stream() .map(String::toUpperCase) .collect(Collectors.toList()); System.out.println(upperCaseNames); // Output: [JOHN, JANE, ADAM]
- Reduce Example:
সমস্ত সংখ্যার যোগফল বের করা:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); int sum = numbers.stream() .reduce(0, (a, b) -> a + b); System.out.println(sum); // Output: 15
Streams API একটি অত্যন্ত শক্তিশালী এবং কার্যকর উপায় Java তে ডেটা প্রসেসিং করতে। এটি ফাংশনাল প্রোগ্রামিংয়ের ধারণাগুলিকে সমর্থন করে এবং কোডকে আরও সিম্পল, পাঠযোগ্য এবং পারফর্ম্যান্ট করে তোলে। স্ট্রিমের সাহায্যে আপনি সহজে ডেটা ফিল্টার, ম্যাপ, রিডিউস, সোর্ট এবং অন্যান্য কার্যক্রম সম্পাদন করতে পারেন, এবং প্যারালাল প্রসেসিংয়ের মাধ্যমে বৃহৎ ডেটাসেটের উপর কাজ করার সময় পারফরম্যান্সও বাড়াতে পারেন।
Read more