1. পরীক্ষা করা হচ্ছে

আমি মনে করি আপনি ইতিমধ্যে ডেটা স্ট্রিমগুলিকে একসাথে কীভাবে চেইন করতে হয় তা শিখতে বিরক্ত হতে পারেন। আপনি অবশেষে ডেটা দিয়ে কিছু করতে চান।

ক্লাসে Streamতিনটি স্ট্যান্ডার্ড পদ্ধতি রয়েছে যা স্ট্রীম তৈরি করে না, বরং তাদের মধ্যে কী ধরনের ডেটা রয়েছে তা পরীক্ষা করে দেখুন। এই পদ্ধতিগুলি হল: anyMatch(), allMatch(), এবং noneMatch().

boolean anyMatch(rule)পদ্ধতি

এই পদ্ধতিটি পরীক্ষা করে যে স্ট্রিমটিতে অন্তত একটি উপাদান আছে যা পদ্ধতিতে পাস করা নিয়মকে সন্তুষ্ট করে। যদি এমন একটি উপাদান থাকে তবে পদ্ধতিটি ফেরত দেয় true, অন্যথায় false

উদাহরণ

কোড বিঃদ্রঃ
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
boolean result = stream.anyMatch(x -> x > 0);

true
Stream<Integer> stream = Stream.of(1, -2, 3, -4, 5);
boolean result = stream.anyMatch(x -> x > 0);

true
Stream<Integer> stream = Stream.of(1, -2, 3, -4, 5);
boolean result = stream.filter(x -> x < 0).anyMatch(x -> x > 0);

false

শেষ উদাহরণে, আমরা প্রথমে শূন্যের চেয়ে কম উপাদানগুলিকে ধরে রাখি এবং তারপরে আমরা ফলাফলটি পরীক্ষা করে দেখি যে কোনও ফিল্টার করা উপাদান শূন্যের চেয়ে বড় কিনা। অবশ্যই, এই ধরনের উপাদান আর নেই.

বুলিয়ান allMatch(নিয়ম) পদ্ধতি

এই পদ্ধতিটি স্ট্রীমের সমস্ত উপাদান নিয়মের সাথে মেলে কিনা তা পরীক্ষা করে (এটি একটি পূর্বাভাস হিসাবেও পরিচিত)। নিয়মটি পদ্ধতিতে একটি যুক্তি হিসাবে পাস করা হয়েছে:

কোড বিঃদ্রঃ
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
boolean result = stream.allMatch(x -> x > 0);
true
(শূন্যের চেয়ে বড় সমস্ত উপাদান)
Stream<Integer> stream = Stream.of(1, -2, 3, -4, 5);
boolean result = stream.allMatch(x -> x > 0);
false
(শূন্যের চেয়ে কম বা সমান উপাদান আছে?)
Stream<Integer> stream = Stream.of(1, -2, 3, -4, 5);
boolean result = stream.filter(x -> x < 0).allMatch(x -> x < 0);
true
(আমরা শূন্যের চেয়ে কম উপাদানগুলি ধরে রেখেছি)

শেষ উদাহরণে, আমরা প্রথমে শুধুমাত্র শূন্যের কম উপাদানগুলিকে ফিল্টারের মধ্য দিয়ে যাওয়ার অনুমতি দিই, এবং তারপরে আমরা চেক করি যে সমস্ত ধরে রাখা উপাদানগুলি শূন্যের কম কিনা। চেক একটি ইতিবাচক ফলাফল দেয়.

বুলিয়ান কোন ম্যাচ (নিয়ম) পদ্ধতি

পদ্ধতিটি noneMatch()পরীক্ষা করে যে স্ট্রীমের কোনো উপাদান নেই যা পাস করা নিয়মের সাথে মেলে। এটি পদ্ধতির বিপরীত মত anyMatch()

কোড বিঃদ্রঃ
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
boolean result = stream.noneMatch(x -> x > 0);

false
Stream<Integer> stream = Stream.of(1, -2, 3, -4, 5);
boolean result = stream.noneMatch(x -> x > 0);

false
Stream<Integer> stream = Stream.of(1, -2, 3, -4, 5);
boolean result = stream.filter(x -> x < 0).noneMatch(x -> x > 0);

true


2. ইউটিলিটি ক্লাস: Optionalক্লাস

nullকখনও কখনও প্রোগ্রামারদের জন্য রেফারেন্সের সাথে কাজ করা খুব অসুবিধাজনক । উদাহরণস্বরূপ, ধরুন আপনি দুটি স্ট্রিং তুলনা করছেন। যদি উভয় ভেরিয়েবল না হয় null, তাহলে আপনি কেবল কল করতে পারেন s1.equals(s2), এবং সবকিছু কাজ করবে। কিন্তু যদি s1হতে পারে null, তাহলে আপনাকে এমন কোড লিখতে হবে যা একটি এড়াতে এই পরিস্থিতি পরিচালনা করে NullPointerException

এই কারণেই প্রোগ্রামাররা Optional<T>ইউটিলিটি ক্লাস নিয়ে এসেছিল। এর কোড মোটামুটি এই মত দেখায়:

কোড বিঃদ্রঃ
class Optional<Type>
{
   private final T type value;
   private Optional() { this.value = null;}
   private Optional(value) { this.value = value;}
   public static <Type> Optional<Type> of(Type value)
   {
      return new Optional<Type>(value);
   }

   public boolean isPresent()
   {
      return value != null;
   }

   public boolean isEmpty()
   {
      return value == null;
   }

   public Type get()
   {
      if (value == null)
      {
         throw new NoSuchElementException();
      }
      return value;
   }

   public Type orElse(Type other)
   {
      return value != null ? value : other;
   }

   public Type orElseThrow()
   {
      if (value == null)
      {
         throw new NoSuchElementException();
      }
      return value;
   }
}










মানটি নেই কিনা তা পরীক্ষা করে null



মানটি null




সঞ্চিত মান প্রদান করে কিনা তা পরীক্ষা করে। মান শূন্য হলে একটি ব্যতিক্রম নিক্ষেপ করে।







সঞ্চিত নন-নাল মান প্রদান করে। অথবা যদি সঞ্চিত মান হয় null, তাহলে একটি পদ্ধতি আর্গুমেন্ট হিসাবে পাস করা মান প্রদান করে



সঞ্চিত নন-নাল মান ফেরত দেয় বা মানটি শূন্য হলে একটি ব্যতিক্রম থ্রো করে।

এই ক্লাসের উদ্দেশ্য হল একটি T অবজেক্ট (একটি বস্তুর রেফারেন্স যার ধরন T) সংরক্ষণ করা। একটি বস্তুর ভিতরে অবজেক্ট রেফারেন্স Optional<T>হতে পারে null

এই ক্লাস প্রোগ্রামারদের সামান্য সুন্দর কোড লিখতে দেয়। আসুন তুলনা করা যাক:

ঐচ্ছিক ব্যবহার করে ঐচ্ছিক ব্যবহার না
public void printString(String s)
{
   Optional<String> str = Optional.ofNullable(s);
   System.out.println(str.orElse(""));
}
public void printString(String s)
{
   String str = s != null ? s : "";
   System.out.println(str)
}

একটি বস্তুকে সর্বদা পদ্ধতি ব্যবহার করে অন্য বস্তুর Optionalসাথে তুলনা করা যেতে পারে , এমনকি যদি তারা রেফারেন্স সংরক্ষণ করে।Optionalequalsnull

সহজভাবে বলতে গেলে, Optionalক্লাস আপনাকে "সুন্দর" চেক লিখতে দেয় এবং কোনো বস্তু একটি মান সঞ্চয় করে nullএমন ইভেন্টে "সুন্দর" অ্যাকশন লিখতে দেয়।Optionalnull



3. উপাদান খোঁজা

ক্লাসে ফিরে আসা যাক Stream। ক্লাসটিতে Streamআরও 4টি পদ্ধতি রয়েছে যা আপনাকে একটি স্ট্রীমের উপাদানগুলি অনুসন্ধান করতে দেয়। এই পদ্ধতিগুলি হল findFirst(), findAny(), min(), এবং max().

Optional<T> findFirst()পদ্ধতি

পদ্ধতিটি findFirst()কেবল স্ট্রীমের প্রথম উপাদানটি ফেরত দেয়। যে সব এটা করে.

এখানে লক্ষণীয় আরও আকর্ষণীয় বিষয় হল যে পদ্ধতিটি কোনও Tবস্তুকে ফেরত দেয় না, বরং একটি Optional<T>মোড়ক বস্তু দেয়। এটি নিশ্চিত করে যে পদ্ধতিটি nullকোনও বস্তু খুঁজে পেতে ব্যর্থ হওয়ার পরে ফিরে আসবে না।

উদাহরণ:

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

আরও স্পষ্ট করার জন্য, চলুন শেষ লাইনটিকে কয়েকটি লাইনে ভেঙে দেওয়া যাক:

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

Stream<String> stream = list.stream();
Optional<String> result = stream.findFirst();
String str = result.get(); // Hello

শেষ get()পদ্ধতিটি হল বস্তুর ভিতরে সংরক্ষিত মান পুনরুদ্ধার করা Optional

Optional<T> findAny()পদ্ধতি

পদ্ধতিটি findAny()স্ট্রীম থেকে যেকোনো উপাদান ফিরিয়ে দেয় এবং সেখানে শেষ হয়। এই পদ্ধতিটি অনুরূপ findFirst(), তবে সমান্তরাল ক্রিয়াকলাপে ব্যবহৃত স্ট্রিমগুলির জন্য এটি দুর্দান্ত।

সমান্তরালভাবে স্ট্রীম প্রক্রিয়াকরণের সময়, এটি একটি উপাদান ইতিমধ্যে একটি স্ট্রীম কিছু অংশে পাওয়া গেছে হতে পারে, কিন্তু এটি প্রথম কিনা তা এখনও স্পষ্ট নয়।

যদি অনেকগুলি উপাদান সমস্ত ফিল্টারের সাথে মিলে যায়, এবং প্রোগ্রামারের জন্য সেগুলির মধ্যে প্রথমটি সঠিকভাবে পাওয়া গুরুত্বপূর্ণ, তবে পদ্ধতিটিকে findFirst()বলা উচিত। যদি প্রোগ্রামার জানে যে বাস্তবে 0 বা 1 উপাদান সমস্ত ফিল্টারের সাথে মিলবে, তবে এটি কেবল কল করাই যথেষ্ট findAny()- এবং এটি দ্রুততর হবে।

Optional<T> min(Comparator<T>)পদ্ধতি

পদ্ধতিটি স্ট্রীমের সমস্ত উপাদান তুলনা করার জন্য min()একটি বস্তু ব্যবহার করে এবং সর্বনিম্ন উপাদান প্রদান করে। comparatorএকটি তুলনাকারী বস্তুকে সংজ্ঞায়িত করার সবচেয়ে সুবিধাজনক উপায় হল একটি ল্যাম্বডা ফাংশন।

সংক্ষিপ্ত স্ট্রিং অনুসন্ধানের উদাহরণ:

ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
String min = list.stream().min( (s1, s2)-> s1.length()-s2.length() ).get();

Optional<T> max(Comparator<T>)পদ্ধতি

পদ্ধতিটি স্ট্রীমের সমস্ত উপাদানের তুলনা করার জন্য max()একটি বস্তু ব্যবহার করে এবং সর্বাধিক উপাদান প্রদান করে। comparatorএকটি তুলনাকারী বস্তুকে সংজ্ঞায়িত করার সবচেয়ে সুবিধাজনক উপায় হল একটি ল্যাম্বডা ফাংশন।

দীর্ঘতম স্ট্রিং অনুসন্ধানের উদাহরণ:

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();