জাভা মধ্যে পূর্বাভাস


100

আমি Predicateজাভা ব্যবহার করে যা কোড দিয়ে যাচ্ছি । আমি কখনও ব্যবহার করি নি Predicate। কেউ আমাকে Predicateজাভাতে কোনও টিউটোরিয়াল বা ধারণাগত ব্যাখ্যা এবং এর প্রয়োগের জন্য গাইড করতে পারেন ?


4
আপনি কি পেয়ারা নিয়ে কথা বলছেন Predicate? কিছু সাদৃশ্য? পুরোপুরি আর কিছু?
বহুবৃক্ষীয় পদার্থ

2
এছাড়াও অ্যাপাচি কমন্স রয়েছেPredicate
ড্যান গ্র্যাভেল

উত্তর:


203

আমি ধরে নিচ্ছি আপনি com.google.common.base.Predicate<T>পেয়ারা থেকে কথা বলছেন

এপিআই থেকে:

প্রদত্ত ইনপুটটির জন্য একটি trueবা falseমান নির্ধারণ করে । উদাহরণস্বরূপ, কোনও RegexPredicateপ্রয়োগ করতে পারে Predicate<String>এবং তার প্রদত্ত নিয়মিত অভিব্যক্তির সাথে মেলে এমন কোনও স্ট্রিংয়ের জন্য সত্য ফিরে আসতে পারে।

এটি মূলত একটি এর জন্য একটি ওওপি বিমূর্ততা boolean পরীক্ষার ।

উদাহরণস্বরূপ, আপনার কাছে এর মতো সহায়ক পদ্ধতি থাকতে পারে:

static boolean isEven(int num) {
   return (num % 2) == 0; // simple
}

এখন, একটি দেওয়া List<Integer>, আপনি কেবল এই জাতীয় সংখ্যাগুলি প্রক্রিয়া করতে পারেন:

    List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
    for (int number : numbers) {
        if (isEven(number)) {
            process(number);
        }
    }

সহ Predicate, ifপরীক্ষাটি এক প্রকার হিসাবে বিমূর্ত করা হয়। এটি এপিআইর বাকী অংশগুলির সাথে ইন্টারঅ্যাক্টের অনুমতি দেয় যেমন Iterablesঅনেকগুলি ইউটিলিটি পদ্ধতি গ্রহণ করেPredicate

সুতরাং, আপনি এখন এই জাতীয় কিছু লিখতে পারেন:

    Predicate<Integer> isEven = new Predicate<Integer>() {
        @Override public boolean apply(Integer number) {
            return (number % 2) == 0;
        }               
    };
    Iterable<Integer> evenNumbers = Iterables.filter(numbers, isEven);

    for (int number : evenNumbers) {
        process(number);
    }

নোট করুন যে এখন জন্য প্রতিটি লুপ ifপরীক্ষা ছাড়াই অনেক সহজ । আমরা একটি ব্যবহার করে সংজ্ঞা দিয়ে Iterable<Integer> evenNumbers, বিমোচনতার উচ্চ স্তরে পৌঁছেছি ।filterPredicate

এপিআই লিঙ্কগুলি

  • Iterables.filter
    • কোনও প্রাকটিকাকে সন্তুষ্ট করে এমন উপাদানগুলি ফেরত দেয়।

উচ্চতর আদেশ ক্রিয়াকলাপে

PredicateIterables.filterএকটি উচ্চ-ক্রম ফাংশন বলা হয় হিসাবে পরিবেশন করতে পারবেন । নিজস্বভাবে, এটি অনেক সুবিধা দেয়। List<Integer> numbersউপরের উদাহরণটি ধরুন । মনে করুন আমরা সমস্ত সংখ্যা ইতিবাচক কিনা তা পরীক্ষা করতে চাই। আমরা এরকম কিছু লিখতে পারি:

static boolean isAllPositive(Iterable<Integer> numbers) {
    for (Integer number : numbers) {
        if (number < 0) {
            return false;
        }
    }
    return true;
}

//...
if (isAllPositive(numbers)) {
    System.out.println("Yep!");
}

একটি Predicate, এবং বাকী লাইব্রেরিগুলির সাথে আন্তঃব্যবস্থা নিয়ে আমরা এর পরিবর্তে এটি লিখতে পারি:

Predicate<Integer> isPositive = new Predicate<Integer>() {
    @Override public boolean apply(Integer number) {
        return number > 0;
    }       
};

//...
if (Iterables.all(numbers, isPositive)) {
    System.out.println("Yep!");
}

আশা করি আপনি এখন "প্রদত্ত প্রিডিকেট দ্বারা সমস্ত উপাদানগুলিকে ফিল্টার করুন", "সমস্ত উপাদান প্রদত্ত প্রাকটিকাকে সন্তুষ্ট করে কিনা", ইত্যাদি আরও ভাল কোডের জন্য তৈরি রুটিনগুলির জন্য উচ্চতর বিমূর্তিতে মানটি দেখতে পাবেন।

দুর্ভাগ্যবশত জাভা প্রথম শ্রেণীর পদ্ধতি নেই: আপনি পাস করতে পারবে না পদ্ধতি কাছাকাছি Iterables.filterএবং Iterables.all। আপনি অবশ্যই জাভাতে অবজেক্টগুলি কাছাকাছি যেতে পারেন । সুতরাং, Predicateপ্রকারটি সংজ্ঞায়িত করা হয়েছে, এবং আপনি পরিবর্তে এই ইন্টারফেস প্রয়োগকারী বস্তুগুলি পাস করেন ।

আরো দেখুন


4
আমি পেয়ারা প্রিডিকেটকে উল্লেখ করছি না, আমার প্রশ্নে আমার পরিষ্কার হওয়া উচিত ছিল। তবে আপনার ব্যাখ্যাটি আমাকে বুঝতে সাহায্য করেছিল যে আমি কী খুঁজছিলাম, জাভাতে প্রাকটিক্যাল যুক্তি কীভাবে ব্যবহৃত হচ্ছে is বিস্তৃত ব্যাখ্যার জন্য ধন্যবাদ
শ্রিকণ্ত

@ পলিজেনালব্রিকেন্টস, Predicate<Integer>আমাদের কাছে ইতিমধ্যে যখন আবিষ্কার করা আছে F<Integer, Boolean>ঠিক একই জিনিসটি কেন?
পেসারিয়ার

আপনি এটি জাভা 8 এর মতো করেও করতে পারেন: List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); Predicate<Integer> isEven = integer -> (integer % 2) == 0; Iterable<Integer> evenNumbers = numbers.stream().filter(isEven).collect(Collectors.toList());

14

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

public interface Predicate<ARGTYPE>
{
    public boolean evaluate(ARGTYPE arg);
}

এবং তারপরে আপনার একটি প্রয়োগ হতে পারে যেমন:

public class Tautology<E> implements Predicate<E>
{
     public boolean evaluate(E arg){
         return true;
     }
}

আরও ভাল ধারণাগত বোঝার জন্য আপনি প্রথম-আদেশের যুক্তিটি পড়তে চাইতে পারেন।

সম্পাদনা
এখানে জাভা 8 হিসাবে জাভা এপিআই-এ সংজ্ঞায়িত একটি স্ট্যান্ডার্ড প্রিডিকেট ইন্টারফেস ( java.util.function.Predicate ) রয়েছে 8 জাভা 8 এর আগে, আপনি com.google.common.base.Predicate ইন্টারফেসটি পুনরায় ব্যবহার করা সুবিধাজনক বলে মনে করতে পারেন পেয়ারা

এছাড়াও, নোট করুন যে জাভা 8 হিসাবে, ল্যাম্বডাস ব্যবহার করে ভবিষ্যদ্বাণীগুলি লেখা আরও সহজ। উদাহরণস্বরূপ, জাভা 8 এবং উচ্চতর ক্ষেত্রে, p -> trueউপরের মতো নামযুক্ত ট্যুটোলজি সাবক্লাস সংজ্ঞায়নের পরিবর্তে কেউ একটি ফাংশনে যেতে পারে ।


0

আপনি দেখতে পারেন জাভা ডক উদাহরণ বা সম্পৃক্ত ব্যবহার উদাহরণ এখানে

মূলত এটি আপনার যে কোনও নির্দিষ্ট মানদণ্ডের উপর ভিত্তি করে ফলাফলসেটে সারিগুলি ফিল্টার করতে এবং আপনার মানদণ্ডগুলি পূরণ করে এমন সারিগুলির জন্য সত্য প্রত্যাবর্তনের জন্য ব্যবহৃত হয়:

 // the age column to be between 7 and 10
    AgeFilter filter = new AgeFilter(7, 10, 3);

    // set the filter.
    resultset.beforeFirst();
    resultset.setFilter(filter);

আমি কম্যান্সের ভবিষ্যদ্বাণীগুলিকে উল্লেখ করছি, ফলাফলগুলি সম্পর্কিত নয়। ধন্যবাদ যদিও
শ্রীকান্ত

0

মিশেল যা বলেছে তা যোগ করে :

আপনি জাভাতে ফিল্টারিং সংগ্রহগুলিতে নীচের হিসাবে প্রডিকেট ব্যবহার করতে পারেন:

public static <T> Collection<T> filter(final Collection<T> target,
   final Predicate<T> predicate) {
  final Collection<T> result = new ArrayList<T>();
  for (final T element : target) {
   if (predicate.apply(element)) {
    result.add(element);
   }
  }
  return result;
}

একটি সম্ভাব্য শিকার হতে পারে:

final Predicate<DisplayFieldDto> filterCriteria = 
                    new Predicate<DisplayFieldDto>() {
   public boolean apply(final DisplayFieldDto displayFieldDto) {
    return displayFieldDto.isDisplay();
   }
  };

ব্যবহার:

 final List<DisplayFieldDto> filteredList=
 (List<DisplayFieldDto>)filter(displayFieldsList, filterCriteria);

1
মূলত এই ধরণের পরাজয় কি উদ্দেশ্য নয়? কার্যকরী পদ্ধতির চয়ন করার মূল কারণ হ'ল ম্যানুয়ালি পুনরাবৃত্তি করা এবং এর জন্য মুক্তি পাওয়া। বিমূর্তির স্তরটি আরও উচ্চতর এবং আরও শক্তিশালী হয়ে ওঠে - তবে ম্যানুয়ালিভাবে সেই উদ্দেশ্যে পরাস্ত করে এবং নিম্ন স্তরের বিমূর্তিতে ফিরে যায়।
ইউজেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.