1. জাভা 8-এ উদ্ভাবন: কার্যকরী প্রোগ্রামিং

জাভা 8 প্রকাশের সাথে সাথে, ভাষাটি কার্যকরী প্রোগ্রামিংয়ের জন্য শক্তিশালী সমর্থন লাভ করে । আপনি এমনকি বলতে পারেন যে এটি কার্যকরী প্রোগ্রামিংয়ের জন্য দীর্ঘ প্রতীক্ষিত সমর্থন অর্জন করেছে। কোডিং দ্রুততর হয়ে উঠেছে, যদিও কোডটি পড়া আরও কঠিন ছিল 🙂

জাভাতে কার্যকরী প্রোগ্রামিং শেখার আগে , আমরা আপনাকে তিনটি জিনিস ভালভাবে বুঝতে সুপারিশ করছি:

  1. OOP, উত্তরাধিকার এবং ইন্টারফেস ( জাভা কোর অনুসন্ধানে স্তর 1-2 )।
  2. একটি ইন্টারফেসে ডিফল্ট পদ্ধতি বাস্তবায়ন
  3. অভ্যন্তরীণ এবং বেনামী ক্লাস

ভাল খবর হল যে জাভাতে কার্যকরী প্রোগ্রামিং এর অনেক বৈশিষ্ট্য ব্যবহার করার জন্য আপনাকে এই সব জানতে হবে না। খারাপ খবর হল বেনামী অভ্যন্তরীণ শ্রেণীগুলি সম্পর্কে না জেনে সবকিছু কীভাবে সাজানো হয়েছে এবং কীভাবে সবকিছু কাজ করে তা বোঝা কঠিন হবে।

আসন্ন পাঠে, আমরা জাভা এর কার্যকরী প্রোগ্রামিং বৈশিষ্ট্যগুলি ব্যবহার করা কতটা সহজ এবং সহজ তার উপর ফোকাস করব, এটি কীভাবে কাজ করে তার গভীর উপলব্ধি ছাড়াই।

জাভাতে কার্যকরী প্রোগ্রামিংয়ের সমস্ত সূক্ষ্মতা বুঝতে কয়েক মাস সময় লাগে। আপনি কয়েক ঘন্টার মধ্যে এই ধরনের কোড পড়তে শিখতে পারেন। তাই আমরা ছোট শুরু করার পরামর্শ দিই। এমনকি যদি এটি I/O স্ট্রিমগুলির সাথে হয়।


2. I/O স্ট্রীম: স্ট্রিম পাইপলাইন

আপনার কি মনে আছে যে একবার আপনি I/O স্ট্রীম সম্পর্কে শিখেছিলেন: InputStream, OutputStream, Reader, Writerইত্যাদি?

স্ট্রীম ক্লাস ছিল যেগুলি ডেটা উত্স থেকে ডেটা পড়ে , যেমন FileInputSteam, এবং মধ্যবর্তী ডেটা স্ট্রীম ছিল যা অন্যান্য স্ট্রীম থেকে ডেটা পড়তে পারে, যেমন InputStreamReaderএবং BufferedReader

এই স্ট্রিমগুলি ডেটা প্রসেসিং পাইপলাইনে সংগঠিত হতে পারে। উদাহরণস্বরূপ, এই মত:

FileInputStream input = new FileInputStream("c:\\readme.txt");
InputStreamReader reader = new InputStreamReader(input);
BufferedReader buff = new BufferedReader(reader);

String text = buff.readLine();

এটা মনে রাখা গুরুত্বপূর্ণ যে কোডের প্রথম কয়েকটি লাইনে, আমরা শুধু Streamবস্তুর একটি চেইন তৈরি করছি। ডেটা এখনও পাইপলাইনের মধ্য দিয়ে যায় নি।

কিন্তু যত তাড়াতাড়ি আমরা buff.readLine()পদ্ধতি কল, নিম্নলিখিত ঘটবে:

  1. বস্তু বস্তুর উপর পদ্ধতি BufferedReaderকলread()InputStreamReader
  2. বস্তু বস্তুর উপর পদ্ধতি InputStreamReaderকলread()FileInputStream
  3. বস্তুটি ফাইল থেকেFileInputStream ডেটা পড়া শুরু করে

অন্য কথায়, স্ট্রীম পাইপলাইন বরাবর ডেটার কোন নড়াচড়া নেই যতক্ষণ না আমরা read()বা এর মত পদ্ধতিতে কল করা শুরু করি readLine()। স্ট্রীম পাইপলাইনের নিছক নির্মাণ এটির মাধ্যমে ডেটা চালায় না। স্ট্রিমগুলি নিজেরাই ডেটা সঞ্চয় করে না। তারা শুধুমাত্র অন্যদের থেকে পড়ে।

সংগ্রহ এবং প্রবাহ

জাভা 8 দিয়ে শুরু করে, সংগ্রহ থেকে ডেটা পড়ার জন্য একটি স্ট্রীম পাওয়া সম্ভব হয়েছিল (এবং শুধুমাত্র তাদের থেকে নয়)। তবে এটি সবচেয়ে আকর্ষণীয় জিনিস নয়। এটি আসলে সহজে এবং সহজভাবে ডেটা স্ট্রিমের জটিল চেইন তৈরি করা সম্ভব হয়েছে। এবং এটি করতে গিয়ে, যে কোডটি আগে 5-10 লাইন লাগত তা এখন 1-2 লাইনে লেখা যেতে পারে।

স্ট্রিংয়ের তালিকায় দীর্ঘতম স্ট্রিং খুঁজে পাওয়ার উদাহরণ:

দীর্ঘতম স্ট্রিং খোঁজা
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
String max = list.stream().max((s1, s2)-> s1.length()-s2.length()).get();
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
Stream<String> stream = list.stream();
Optional<String> optional = stream.max((s1, s2)-> s1.length()-s2.length());
String max = optional.get();

3. Streamইন্টারফেস

স্ট্রীমের জন্য Java 8 এর বর্ধিত সমর্থন ইন্টারফেস ব্যবহার করে প্রয়োগ করা হয় Stream<T>, যেখানে Tএকটি টাইপ প্যারামিটার যা স্ট্রীমে পাস করা ডেটার ধরন নির্দেশ করে। অন্য কথায়, একটি স্ট্রীম যে ধরনের ডেটা পাস করে তার থেকে সম্পূর্ণ স্বাধীন।

একটি সংগ্রহ থেকে একটি স্ট্রিম অবজেক্ট পেতে , শুধু তার stream()পদ্ধতি কল করুন। কোড মোটামুটি এই মত দেখায়:

Stream<Type> name = collection.stream();
একটি সংগ্রহ থেকে একটি স্ট্রীম পাওয়া

এই ক্ষেত্রে, সংগ্রহটিকে স্ট্রিমের ডেটা উত্স হিসাবে বিবেচনা করা হবে এবং Stream<Type>বস্তুটি একটি ডেটা স্ট্রিম আকারে সংগ্রহ থেকে ডেটা পাওয়ার জন্য একটি সরঞ্জাম হবে৷

ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
Stream<String> stream = list.stream();

যাইহোক, আপনি শুধুমাত্র সংগ্রহ থেকে নয়, অ্যারে থেকেও একটি স্ট্রিম পেতে পারেন । এটি করার জন্য, আপনাকে পদ্ধতিটি ব্যবহার করতে হবে। উদাহরণ স্বরূপ:Arrays.stream()

Stream<Type> name = Arrays.stream(array);
একটি অ্যারে থেকে একটি স্ট্রীম হচ্ছে

এই ক্ষেত্রে, অ্যারেটিকে স্ট্রিম নামক ডেটা উত্স হিসাবে বিবেচনা করা হবে name

Integer[] array = {1, 2, 3};
Stream<Integer> stream = Arrays.stream(array);

Stream<Type>অবজেক্ট তৈরি হলে কোনো ডাটা সরানো হয় না । একটি স্ট্রিম পাইপলাইন নির্মাণ শুরু করার জন্য আমরা কেবল একটি স্ট্রিম অবজেক্ট পেয়েছি।