CodeGym /Java Blog /এলোমেলো /উদাহরণ সহ জাভা প্রিডিকেট
John Squirrels
লেভেল 41
San Francisco

উদাহরণ সহ জাভা প্রিডিকেট

এলোমেলো দলে প্রকাশিত
সাধারণত predicate মানে একটি বিবৃতি যা নির্ধারণ করে যে একটি মান সত্য বা মিথ্যা হতে পারে। প্রোগ্রামিং-এ ভবিষ্যদ্বাণী মানে এমন একটি আর্গুমেন্ট সহ ফাংশন যা একটি বুলিয়ান মান প্রদান করে। কার্যকরী ইন্টারফেস প্রিডিকেট জাভা 8 এ উপলব্ধি করা হয়েছিল। "ফাংশনাল" এর অর্থ হল এটিতে শুধুমাত্র একটি বিমূর্ত পদ্ধতি রয়েছে। এটি একটি যুক্তি গ্রহণ করে এবং একটি বুলিয়ান প্রদান করে। জাভাতে, কার্যকরী ইন্টারফেসগুলি ল্যাম্বডা এক্সপ্রেশন, কনস্ট্রাক্টর এবং মেথড রেফারেন্স পরিচালনার জন্য ব্যবহার করা হয়। সাধারণত Java 8 Predicate বস্তুর সংগ্রহের জন্য একটি ফিল্টার প্রয়োগ করতে ব্যবহৃত হয়। আসুন এর প্রধান অ্যাপ্লিকেশন এবং বহুল ব্যবহৃত পদ্ধতিগুলির দিকে নজর দেওয়া যাক, সেইসাথে কিছু অনুশীলন সমস্যার সমাধান করা যাক। উদাহরণ সহ জাভা প্রিডিকেট - ১

কেন ডেভেলপাররা Predicate ব্যবহার করেন

মূলত, বিকাশকারীরা পূর্বনির্ধারিত মানদণ্ডের উপর ভিত্তি করে আইটেমগুলির মূল্যায়ন এবং একটি বুলিয়ান মান ফেরত সহ যে কোনও কাজের জন্য পূর্বনির্ধারণ ব্যবহার করতে পারে। এখানে সাধারণ কাজগুলির উদাহরণ রয়েছে যা বিকাশকারীরা পূর্বাভাস ব্যবহার করে পরিচালনা করেন:
  • পূর্ণসংখ্যার একটি সেট ফিল্টার করা।
  • তথ্যটি বেশ কয়েকটি পূর্বনির্ধারিত শর্তের সাথে সঙ্গতিপূর্ণ তা নিশ্চিত করে তালিকা বাছাই করা (যেমন মূল্য এবং ওজনের শর্ত সেট করে আইটেমগুলির একটি পরিসর সংগঠিত করা)।
  • সমসাময়িক প্রোগ্রামিং-এ ইউটিলিটি প্যাকেজ ব্যবহার করা।
সফ্টওয়্যার পরীক্ষায় পূর্বাভাস একটি গুরুত্বপূর্ণ বৈশিষ্ট্য। কার্যকরী ইন্টারফেস পরীক্ষার জন্য ইউনিট আলাদা করা সহজ করে তোলে, অ্যাপ কোডের পঠনযোগ্যতা এবং পরিচালনাযোগ্যতা উন্নত করে।

জাভাতে প্রিডিকেট সিনট্যাক্স

java.util.function.Predicate জাভা 8 এ চালু করা হয়েছিল ল্যাম্বডায় মূল্যায়ন ইমপ্রেশন পরিচালনা করার বিকল্প উপায় হিসাবে। ইন্টারফেসের স্ট্যান্ডার্ড ভিউ হল Predicate<T> , যেখানে T হল একটি একক আর্গুমেন্ট যা একটি বুলিয়ান মান প্রদান করে। জাভা প্রিডিকেটের একটি কার্যকরী (বিমূর্ত) পদ্ধতি পরীক্ষা (বস্তু) রয়েছে যা একটি নির্দিষ্ট বস্তুতে এই পূর্বাভাসের মূল্যায়ন করে।

@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
}
এখানে একটি সাধারণ Predicate লেখার একটি উদাহরণ দেওয়া হল যা “এর চেয়ে বড়”, “এর চেয়ে কম” শর্তের উপর ভিত্তি করে পূর্ণসংখ্যা ফিল্টার করে।

// An example of a simple Java predicate
  
import java.util.function.Predicate; 
public class PredicateExample { 
    public static void main(String[] args) 
    { 
        // Creating predicate 
        Predicate<Integer> lesserThan = i -> (i < 18);  
  
        // Calling Predicate method 
        System.out.println(lesserThan.test(10));  
    }
}
আউটপুটটি সত্য হবে কারণ 10 < 18। প্রিডিকেট ইন ফিল্টার() এর সাথে আরও একটি উদাহরণ । Predicate বয়সের তালিকা থেকে সমস্ত প্রাপ্তবয়স্কদের ফিল্টার করতে সাহায্য করে।

  import java.util.List;
  import java.util.function.Predicate;

  public class PredicateExample {
      public static void main(String[] args) {
          List<Integer> ages = List.of(17, 18, 19, 28, 18, 28, 46, 7, 8, 9, 21, 12);
          NotLessThan18<Integer> isAdult = new NotLessThan18<>();
          ages.stream().filter(isAdult).forEach(System.out::println);
      }
  }



class NotLessThan18<E> implements Predicate<Integer> {

      @Override
      public boolean test(Integer v) {
          Integer ADULT = 18;
          return v >= ADULT;
      }
  }
আউটপুট হল:
18 19 28 18 28 46 21

Java 8 Predicate Methods

Predicate ইন্টারফেস পদ্ধতি একটি মুষ্টিমেয় আছে.
  • বুলিয়ান টেস্ট(টি টি) প্রদত্ত আর্গুমেন্টের পূর্বাভাস মূল্যায়ন করে।
  • ডিফল্ট Predicate<T> এবং(Predicate<? super T> other) একটি প্রিডিকেট প্রদান করে যা একটি শর্ট সার্কিটিং লজিক্যাল AND এই প্রিডিকেটের এবং অন্যটি উপস্থাপন করে।
  • ডিফল্ট Predicate<T> অথবা একটি সংমিশ্রিত প্রিডিকেট প্রদান করে যা একটি শর্ট-সার্কিটিং লজিক্যাল OR এই প্রিডিকেট এবং অন্যটির প্রতিনিধিত্ব করে।
  • ডিফল্ট Predicate<T> negate() একটি predicate প্রদান করে যেটি যৌক্তিকভাবে এই predicate এর বিপরীত।
  • ডিফল্ট Predicate<T> isEqual(Object targetRef) পরীক্ষার ফলাফল প্রদান করে যদি দুটি আর্গুমেন্ট Objects.equals(Object, Object) অনুযায়ী সমান হয় ।

বুলিয়ান পরীক্ষা (টি টি)

এটি জাভা ভবিষ্যদ্বাণীগুলির জন্য একটি কার্যকরী পদ্ধতি যা একটি প্রদত্ত যুক্তি একটি প্রিডিকেটের শর্তকে সন্তুষ্ট করে কিনা তা মূল্যায়ন করে। উদাহরণ: এখানে আমরা 18 বা তার বেশি বয়সী প্রত্যেকের জন্য একটি প্রিডিকেট প্রাপ্তবয়স্ক তৈরি করি। test() পদ্ধতি একটি পূর্ণসংখ্যা মান পায় এবং এটি পরীক্ষা করে।

import java.util.function.Predicate;
public class PredicateTestTest {
   public static void main(String[] args) {
       Predicate<Integer> adult = i -> i >= 18;
       System.out.println(adult.test(12));
       System.out.println(adult.test(19));
       System.out.println(adult.test(21));
   }
}
উপরের কোডের আউটপুট কি হবে? প্রথম ক্ষেত্রে, যেহেতু 12টি 18-এর থেকে কম, তাই এটি মিথ্যা হবে। দ্বিতীয় এবং তৃতীয় দৃশ্যের জন্য, শর্ত পূরণ করা হয় তাই প্রত্যাবর্তন সত্য হবে।
মিথ্যা সত্য সত্য

ডিফল্ট Predicate.and()

এই পদ্ধতিটি "এবং" অপারেটরকে উপস্থাপন করে। এই কারণেই, যদি প্রদত্ত পূর্বাভাসগুলির মধ্যে একটি নির্দিষ্ট শর্ত মেনে না চলে, তবে অন্য একটি মূল্যায়ন পাবে না। উদাহরণ: চলুন জাভাতে ভবিষ্যদ্বাণী রচনা করি, যারা ইতিমধ্যেই প্রাপ্তবয়স্ক কিন্তু ৬৫ বছরের কম বয়সী এবং() ব্যবহার করে তাদের ফিল্টার করি । আসুন predicate.add () ব্যবহার করি এবং এই শর্তগুলির জন্য lambda দিয়ে একটি java predicate লিখি: শর্তটি সত্য হলে, অ্যাপটি নিম্নলিখিত বিবৃতিটি ফিরিয়ে দেবে:

import java.util.function.Predicate;

   public class PredicateDemo {
       public static void main(String[] args) {
           Predicate<Integer> adultYet = i -> i >= 18;
           Predicate<Integer> adultStill = i -> i < 65;
           System.out.println(adultYet.and(adultStill).test(5));
           System.out.println(adultYet.and(adultStill).test(38));
           System.out.println(adultYet.and(adultStill).test(90));
       }
   }
আউটপুট হল:
মিথ্যা সত্য মিথ্যা

ডিফল্ট Predicate.or()

Predicate.or() পদ্ধতি "OR" অপারেটর প্রতিনিধিত্ব করে। এর মানে হল যে দুটি ভবিষ্যদ্বাণীর একটি সত্য এবং অন্যটি মিথ্যা হলেও শর্তটি সত্য থাকবে। উদাহরণ: এখন অক্ষর স্ট্রিং মূল্যায়ন করা যাক. "my" বা "crayon" সাবস্ট্রিং ধারণ করে এমন সমস্ত বাক্যাংশ সাজানোর জন্য OR পদ্ধতি ব্যবহার করার চেষ্টা করুন।

import java.util.function.Predicate;

  public class PredicateDemo2 {
      public static void main(String[] args) {
          Predicate<String> containsA = t -> t.contains("crayon");
          Predicate<String> containsB = t -> t.contains("my");
          System.out.println(containsA.or(containsB).test("here is my crayon"));
          System.out.println(containsA.or(containsB).test("here is my pencil"));
          System.out.println(containsA.or(containsB).test("here is John's crayon"));
          System.out.println(containsA.or(containsB).test("here is John's pencil"));
      }
  }
আউটপুট হল:
সত্য সত্য সত্য মিথ্যা

ডিফল্ট Predicate negate()

negate() পদ্ধতিটি সমস্ত মান সংগ্রহ করতে ব্যবহৃত হয় যা পূর্বনির্ধারিত মানদণ্ড মেনে চলে না। উদাহরণ: আপনি যদি "টমেটো" ক্লাসের মাধ্যমে সাজাতে চান এবং "লাল" নয় এমন সমস্ত এন্ট্রি খুঁজে পেতে চান, তাহলে আপনি একটি পূর্বাভাস লিখতে পারেন এবং পুরো ক্রমটি দ্রুত স্ক্যান করতে পারেন। এটির জন্য কোডটি নিজে থেকে লেখার চেষ্টা করুন এবং এটি হয়ে গেলে সমাধানের বিরুদ্ধে পরীক্ষা করুন।

import java.util.function.Predicate;

public class PredicateDemo3 {
public static void main(String[] args) {
 Predicate<Integer> adult = i -> i >= 18;
System.out.println(adult.negate().test(7));  System.out.println(adult.negate().test(19))
  }
   }
আউটপুট হল:
সত্য মিথ্যা

স্ট্যাটিক প্রিডিকেট isEqual(অবজেক্ট টার্গেটরেফ)

এই পদ্ধতিটি অত্যন্ত কার্যকর যদি আপনি নির্ধারণ করতে চান যে দুটি বস্তু Objects.equals() এর একটি প্যারামিটার হিসাবে সংজ্ঞায়িত একটি মানের সমান কিনা। এই পদ্ধতিটি বিশেষভাবে উপযোগী যদি আপনি একই ধরনের পরীক্ষার ফলাফল তুলনা করতে চান। উদাহরণ: ধরা যাক আপনি নাশপাতির দুটি গাড়ির তুলনা করছেন এবং নিশ্চিত করতে চান যে উভয়েরই একটি আদর্শ ওজন এবং রঙের ফল আছে কিনা। এই ক্ষেত্রে, স্ট্যাটিক Predicate isEqual(Object targetRef) ঠিক আপনার প্রয়োজনীয় পদ্ধতি। আসুন দেখে নেওয়া যাক কিভাবে isEqual দুটি স্ট্রিংয়ের সমতা পরীক্ষা করে:

import java.util.function.Predicate;

public class PredicateDemo2 {
   public static void main(String[] args) {
       Predicate<String> i = Predicate.isEqual("here is my crayon");
       System.out.println(i.test("here is my pencil"));
       System.out.println(i.test("here is my crayon"));
   }
}
আপনি বিশ্লেষণ করছেন এমন একটি বস্তু যদি স্ট্যান্ডার্ড শর্ত মেনে চলে, তাহলে ফাংশনটি সত্য হবে। আউটপুট হল:
সত্য মিথ্যা

জাভা IntPredicate

Java IntPredicate হল একটি কার্যকরী ইন্টারফেস, তাই আপনি এটিকে ল্যাম্বডা এক্সপ্রেশন বা পদ্ধতির রেফারেন্সের জন্য অ্যাসাইনমেন্ট টার্গেট হিসাবে ব্যবহার করতে পারেন। IntPredicate একটি পূর্ণসংখ্যার উপর কাজ করে এবং একটি শর্তের উপর ভিত্তি করে একটি predicate মান প্রদান করে। যেমন Predicate ইন্টারফেস, IntPredicate-এ test() , and() , negate() , or() পদ্ধতি রয়েছে। এখানে IntPredicate এর একটি উদাহরণ। এটি অ্যারে থেকে সমস্ত প্রাপ্তবয়স্কদের (18 বা তার বেশি) ফিল্টার করে।

import java.util.Arrays;
import java.util.function.IntPredicate;

public class IntPredicateExample {

   public static void main(String[] args) {

       int[] ages = { 18, 28, 18, 46, 90, 45, 2, 3, 1, 5, 7, 21, 12 };

       IntPredicate p = n -> n >= 18;

       Arrays.stream(ages).filter(p).forEach(System.out::println);
   }
}
আউটপুট হল:
18 28 18 46 90 45 21

জাভাতে ক্লিন প্রিডিকেট লেখা

Java Predicates অত্যন্ত কার্যকরী এবং কাজ করার জন্য মজাদার। যাইহোক, আপনি যতক্ষণ না লেম্বডা এক্সপ্রেশনগুলি লিখছেন তা কোডকে কীভাবে প্রভাবিত করে সে সম্পর্কে আপনি সচেতন না হলে, অগোছালো পূর্বাভাসের সাথে কোড রক্ষণাবেক্ষণযোগ্যতা হ্রাস করার ঝুঁকি রয়েছে। এখানে কয়েকটি সহজ অভ্যাস রয়েছে যা আপনাকে নিশ্চিত করতে সাহায্য করবে যে আপনার কার্যকরী ইন্টারফেসগুলি পরিচালনা করা এবং পড়া সহজ।
  • নিজেকে পুনরাবৃত্তি করবেন না — একাধিক বার বারবার মান, পদ্ধতি এবং শর্তগুলির সাথে জাভা দিয়ে পূর্বাভাস রচনা করবেন না। এইভাবে, আপনি আপনার উত্পাদনশীল সময় নষ্ট করেন এবং কোডটিকে অগোছালো করে তোলেন।
  • পরীক্ষাযোগ্যতা নিশ্চিত করতে অ্যাপ কোড থেকে পৃথক পূর্বাভাস। তা ছাড়া, একটি পূর্বনির্ধারিত ইউনিট পরীক্ষার সময়সূচী তৈরি করুন এবং এটিতে লেগে থাকুন।
  • আপনার ক্লাসগুলি যাতে ফুলে না যায় এবং পরিচালনা করা সহজ থাকে তা নিশ্চিত করতে আমদানি এবং কম্পোজিশন প্যাটার্ন ব্যবহার করুন।
  • হেল্পার ক্লাসে জাভা ভবিষ্যদ্বাণীগুলি সরানোর কথা বিবেচনা করুন — এইভাবে, আপনি আপনার কোডের পুনঃব্যবহারযোগ্যতা উন্নত করবেন এবং রক্ষণাবেক্ষণের সুবিধা পাবেন।
  • পঠনযোগ্যতা — যখনই সম্ভব, জটিল পূর্বাভাসের চেয়ে এক-লাইন বিবৃতি পছন্দ করুন। এটি জটিল কার্যকরী ইন্টারফেস সম্পর্কে আপনার বোঝার প্রদর্শন করতে প্রলুব্ধ হতে পারে। তবে রক্ষণাবেক্ষণের ক্ষেত্রে কম বেশি।
মন্তব্য
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION