জাভা 8 স্ট্রিম এপিআই কি এবং কিভাবে এটি আপনার কোড রূপান্তর করতে পারে?
Java 8 Stream API হল জাভা ডেভেলপারদের জন্য একটি গেম-চেঞ্জার, যা ঘোষণামূলক এবং দক্ষতার সাথে ডেটা প্রক্রিয়া করার একটি নতুন উপায় অফার করে। এই টিউটোরিয়ালটি আপনাকে স্ট্রীম API এর ইনস এবং আউটগুলির মাধ্যমে গাইড করবে, আপনাকে এর শক্তিশালী বৈশিষ্ট্যগুলি বুঝতে এবং কীভাবে সেগুলিকে আপনার কোডে ব্যবহার করতে হয় তা বুঝতে সাহায্য করবে৷
সুচিপত্র
অধ্যায় | বর্ণনা |
---|---|
ভূমিকা | জাভা 8 স্ট্রীম API এর ওভারভিউ |
স্ট্রীম সৃষ্টি | স্ট্রীম তৈরি করার বিভিন্ন উপায় |
ইন্টারমিডিয়েট অপারেশন | বিভিন্ন মধ্যবর্তী ক্রিয়াকলাপের ব্যাখ্যা |
টার্মিনাল অপারেশন | টার্মিনাল অপারেশন এবং তাদের প্রভাব ওভারভিউ |
সমান্তরাল প্রবাহ | ভাল পারফরম্যান্সের জন্য সমান্তরাল স্ট্রীমগুলি কীভাবে ব্যবহার করবেন |
ব্যবহারিক উদাহরণ | স্ট্রিম API-এর ব্যবহার প্রদর্শনকারী কোড উদাহরণ |
স্ট্রিম API ব্যবহার করার সুবিধা | জাভা ডেভেলপমেন্টে স্ট্রিম API ব্যবহার করার সুবিধা |
সাধারণ ক্ষতি | সাধারণ ভুলগুলি এবং কীভাবে সেগুলি এড়ানো যায় |
উপসংহার | মূল পয়েন্ট এবং চূড়ান্ত চিন্তার সারাংশ |
ভূমিকা
জাভা 8 ভাষাতে অনেকগুলি নতুন বৈশিষ্ট্য নিয়ে এসেছে, তবে সবচেয়ে প্রভাবশালী ছিল স্ট্রিম API। এই API উপাদানগুলির ক্রম প্রক্রিয়াকরণের জন্য একটি কার্যকরী পদ্ধতি প্রদান করে, যা বিকাশকারীদের আরও সংক্ষিপ্ত এবং পাঠযোগ্য কোড লিখতে দেয়। স্ট্রীম ডেটা স্ট্রাকচার নয়; এগুলি বিমূর্ততা যা আপনাকে ঘোষণামূলক পদ্ধতিতে ডেটা প্রক্রিয়া করার অনুমতি দেয়।
স্ট্রীম সৃষ্টি
সংগ্রহ, অ্যারে, বা I/O চ্যানেলের মতো বিভিন্ন ডেটা উত্স থেকে স্ট্রিম তৈরি করা যেতে পারে। এখানে স্ট্রীম তৈরি করার কিছু সাধারণ উপায় রয়েছে:
সংগ্রহ থেকে
আপনি যেকোনো সংগ্রহ থেকে একটি স্ট্রিম তৈরি করতে পারেন (যেমন, তালিকা, সেট)।
তালিকা list = Arrays.asList("a", "b", "c"); প্রবাহ stream = list.stream();
Arrays থেকে
আপনি একটি অ্যারে থেকে একটি স্ট্রিম তৈরি করতে পারেন।
স্ট্রিং[] অ্যারে = {"a", "b", "c"}; প্রবাহ stream = Arrays.stream(array);
ফাইল থেকে
Java NIO একটি ফাইল থেকে একটি স্ট্রিম তৈরি করার একটি পদ্ধতি প্রদান করে।
প্রবাহ লাইন = Files.lines(Paths.get("file.txt"));
অসীম প্রবাহ
আপনি ব্যবহার করে অসীম স্ট্রীম তৈরি করতে পারেন Stream.generate
বা Stream.iterate
.
প্রবাহ infiniteStream = Stream.iterate(0, n -> n + 1);
ইন্টারমিডিয়েট অপারেশন
মধ্যবর্তী ক্রিয়াকলাপগুলি একটি নতুন স্ট্রীম ফিরিয়ে দেয় এবং অলসভাবে সম্পাদিত হয়, যার অর্থ একটি টার্মিনাল অপারেশন চালু না হওয়া পর্যন্ত সেগুলি সঞ্চালিত হয় না। এগুলি ডেটা রূপান্তর বা ফিল্টার করতে ব্যবহৃত হয়।
ছাঁকনি
একটি শর্তের উপর ভিত্তি করে উপাদান ফিল্টার করে।
প্রবাহ filteredStream = stream.filter(s -> s.startsWith("a"));
মানচিত্র
উপাদানগুলিকে রূপান্তরিত করে।
প্রবাহ lengthStream = stream.map(স্ট্রিং::দৈর্ঘ্য);
সমতল মানচিত্র
নেস্টেড কাঠামো সমতল করে।
প্রবাহ flatMappedStream = stream.flatMap(s -> Arrays.stream(s.split("")));
সাজানো
উপাদান সাজান.
প্রবাহ sortedStream = stream.sorted();
স্বতন্ত্র
সদৃশ উপাদানগুলি সরিয়ে দেয়।
প্রবাহ distinctstream = stream.distinct();
সীমা এবং এড়িয়ে যান
প্রদত্ত সংখ্যক উপাদানে স্ট্রীমকে ছোট করে বা প্রথম n উপাদানগুলি এড়িয়ে যায়৷
প্রবাহ limitedStream = stream.limit(2); প্রবাহ skippedStream = stream.skip(2);
টার্মিনাল অপারেশন
টার্মিনাল ক্রিয়াকলাপগুলি একটি ফলাফল বা একটি পার্শ্ব-প্রতিক্রিয়া তৈরি করে এবং স্ট্রিম প্রক্রিয়াকরণের সমাপ্তি চিহ্নিত করে৷ একবার একটি টার্মিনাল অপারেশন চালানো হলে, স্ট্রীমটি আর ব্যবহার করা যাবে না।
প্রতিটির জন্য
প্রতিটি উপাদানের জন্য একটি ক্রিয়া সম্পাদন করে।
stream.forEach(System.out::println);
সংগ্রহ করুন
স্ট্রীমকে একটি সংগ্রহ বা অন্য ডেটা কাঠামোতে রূপান্তর করে।
তালিকা list = stream.collect(Collectors.toList());
কমিয়ে দিন
স্ট্রীমকে একটি একক মান কমিয়ে দেয়।
ঐচ্ছিক concatenated = stream.reduce((s1, s2) -> s1 + s2);
গণনা
উপাদানের সংখ্যা প্রদান করে।
long count = stream.count();
ম্যাচ অপারেশন
একটি প্রদত্ত পূর্বাভাসের সাথে কোনো, সমস্ত বা কোনো উপাদানের সাথে মেলে কিনা তা পরীক্ষা করে।
বুলিয়ান anyMatch = stream.anyMatch(s -> s.startsWith("a")); বুলিয়ান allMatch = stream.allMatch(s -> s.length() > 1); বুলিয়ান noneMatch = stream.noneMatch(s -> s.isEmpty());
প্রথম খুঁজুন এবং যে কোনো খুঁজুন
স্ট্রীম থেকে প্রথম বা যেকোনো উপাদান প্রদান করে।
ঐচ্ছিক first = stream.findFirst(); ঐচ্ছিক any = stream.findAny();
সমান্তরাল প্রবাহ
মাল্টি-কোর প্রসেসরকে লিভারেজ করার জন্য স্ট্রিমগুলিকে সহজেই সমান্তরাল স্ট্রীমে রূপান্তরিত করা যেতে পারে এবং একই সাথে অপারেশনগুলি সম্পাদন করতে পারে।
প্রবাহ parallelStream = list.parallelStream();
সমান্তরাল স্ট্রীমগুলি বৃহৎ ডেটা সেটগুলির জন্য কার্যক্ষমতাকে উল্লেখযোগ্যভাবে উন্নত করতে পারে তবে একত্রিত সমস্যা এড়াতে সতর্কতার সাথে ব্যবহার করা উচিত।
ব্যবহারিক উদাহরণ
উদাহরণ 1: ফিল্টার এবং সংগ্রহ করুন
আসুন "a" দিয়ে শুরু হওয়া স্ট্রিংগুলির একটি তালিকা ফিল্টার করি এবং একটি নতুন তালিকায় সংগ্রহ করি।
তালিকা ফলাফল = list.stream() .filter(s -> s.startsWith("a")) .collect(Collectors.toList());
উদাহরণ 2: মানচিত্র এবং হ্রাস করুন
স্ট্রিংগুলির একটি তালিকাকে বড় হাতের অক্ষরে রূপান্তর করুন এবং তাদের সংযুক্ত করুন।
ঐচ্ছিক ফলাফল = list.stream() .map(String::toUpperCase).reduce((s1, s2)-> s1 + s2);
উদাহরণ 3: সাজানো এবং সীমাবদ্ধ করা
স্ট্রিংগুলির একটি তালিকা সাজান এবং প্রথম 3টি উপাদান পান।
তালিকা ফলাফল = list.stream() .sorted() .limit(3) .collect(Collectors.toList());
স্ট্রিম API ব্যবহার করার সুবিধা
সংক্ষিপ্ত কোড
স্ট্রিম API আরও সংক্ষিপ্ত এবং পাঠযোগ্য কোডের জন্য অনুমতি দেয়। যে ক্রিয়াকলাপগুলির জন্য একাধিক লাইন এবং লুপের প্রয়োজন হয় সেগুলি প্রায়শই একক লাইনে হ্রাস করা যেতে পারে।
উন্নত কর্মক্ষমতা
সমান্তরালভাবে ডেটা প্রক্রিয়া করার ক্ষমতা সহ, স্ট্রিম এপিআই বড় ডেটা সেটগুলির জন্য কার্যক্ষমতা উল্লেখযোগ্যভাবে উন্নত করতে পারে।
কার্যকরী প্রোগ্রামিং দৃষ্টান্ত
স্ট্রিম API জাভাতে কার্যকরী প্রোগ্রামিং ধারণাগুলি প্রবর্তন করে, এটি আরও ঘোষণামূলক পদ্ধতিতে জটিল ডেটা ম্যানিপুলেশনগুলি সম্পাদন করা সহজ করে তোলে।
সাধারণ ক্ষতি
পরিবর্তনশীলতা
মধ্যবর্তী ক্রিয়াকলাপগুলির মধ্যে স্ট্রিমের উত্স পরিবর্তন করা এড়িয়ে চলুন, কারণ এটি অনির্দেশ্য আচরণের দিকে নিয়ে যেতে পারে।
সমান্তরাল প্রবাহ
সাবধানতার সাথে সমান্তরাল স্ট্রীমগুলি ব্যবহার করুন, কারণ তারা একযোগে সমস্যাগুলি উপস্থাপন করতে পারে এবং সর্বদা কর্মক্ষমতা উন্নতির দিকে নিয়ে যেতে পারে না।
অলস মূল্যায়ন
মনে রাখবেন যে মধ্যবর্তী ক্রিয়াকলাপগুলি অলস। প্রসেসিং ট্রিগার করার জন্য আপনি একটি টার্মিনাল অপারেশন শুরু করেছেন তা নিশ্চিত করুন।
উপসংহার
Java 8 Stream API হল একটি শক্তিশালী টুল যা আপনার জাভা কোড লেখার পদ্ধতিকে রূপান্তর করতে পারে। ডেটা প্রক্রিয়াকরণের জন্য একটি কার্যকরী পদ্ধতি প্রদান করে, এটি আরও সংক্ষিপ্ত, পঠনযোগ্য এবং দক্ষ কোডের জন্য অনুমতি দেয়। আপনি ডেটা ফিল্টার করছেন, রূপান্তর করছেন বা একত্রিত করছেন না কেন, স্ট্রিম এপিআই একটি নমনীয় এবং শক্তিশালী সমাধান প্রদান করে। যেকোনো টুলের মতো, এটি কার্যকরভাবে ব্যবহার করার জন্য এর ক্ষমতা এবং সীমাবদ্ধতাগুলি বোঝা গুরুত্বপূর্ণ।
আপনার প্রকল্পগুলিতে স্ট্রিম API অন্বেষণ করুন এবং জাভা প্রোগ্রামিংয়ের আরও আধুনিক, কার্যকরী পদ্ধতির সুবিধাগুলি অনুভব করুন৷