আমি Predicate
জাভা ব্যবহার করে যা কোড দিয়ে যাচ্ছি । আমি কখনও ব্যবহার করি নি Predicate
। কেউ আমাকে Predicate
জাভাতে কোনও টিউটোরিয়াল বা ধারণাগত ব্যাখ্যা এবং এর প্রয়োগের জন্য গাইড করতে পারেন ?
Predicate
আমি Predicate
জাভা ব্যবহার করে যা কোড দিয়ে যাচ্ছি । আমি কখনও ব্যবহার করি নি Predicate
। কেউ আমাকে Predicate
জাভাতে কোনও টিউটোরিয়াল বা ধারণাগত ব্যাখ্যা এবং এর প্রয়োগের জন্য গাইড করতে পারেন ?
Predicate
উত্তর:
আমি ধরে নিচ্ছি আপনি 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
, বিমোচনতার উচ্চ স্তরে পৌঁছেছি ।filter
Predicate
Iterables.filter
Predicate
Iterables.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
প্রকারটি সংজ্ঞায়িত করা হয়েছে, এবং আপনি পরিবর্তে এই ইন্টারফেস প্রয়োগকারী বস্তুগুলি পাস করেন ।
Predicate<Integer>
আমাদের কাছে ইতিমধ্যে যখন আবিষ্কার করা আছে F<Integer, Boolean>
ঠিক একই জিনিসটি কেন?
প্রিডিকেট এমন একটি ফাংশন যা কোনও সত্য / মিথ্যা (অর্থাত্ বুলিয়ান) মান দেয়, এমন প্রস্তাবের বিপরীতে যা সত্য / মিথ্যা (অর্থাত্ বুলিয়ান) মান। জাভাতে, কারও কাছে স্বতন্ত্র ফাংশন থাকতে পারে না এবং তাই কোনও একটি প্রাক্টিকেটের প্রতিনিধিত্ব করে এমন একটি অবজেক্টের জন্য একটি ইন্টারফেস তৈরি করে একটি শিকারী তৈরি করে এবং তারপরে একটি এমন একটি শ্রেণি সরবরাহ করে যা সেই ইন্টারফেসটি প্রয়োগ করে। একটি শিকারী জন্য একটি ইন্টারফেস উদাহরণ হতে পারে:
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
উপরের মতো নামযুক্ত ট্যুটোলজি সাবক্লাস সংজ্ঞায়নের পরিবর্তে কেউ একটি ফাংশনে যেতে পারে ।
আপনি দেখতে পারেন জাভা ডক উদাহরণ বা সম্পৃক্ত ব্যবহার উদাহরণ এখানে
মূলত এটি আপনার যে কোনও নির্দিষ্ট মানদণ্ডের উপর ভিত্তি করে ফলাফলসেটে সারিগুলি ফিল্টার করতে এবং আপনার মানদণ্ডগুলি পূরণ করে এমন সারিগুলির জন্য সত্য প্রত্যাবর্তনের জন্য ব্যবহৃত হয়:
// the age column to be between 7 and 10
AgeFilter filter = new AgeFilter(7, 10, 3);
// set the filter.
resultset.beforeFirst();
resultset.setFilter(filter);
মিশেল যা বলেছে তা যোগ করে :
আপনি জাভাতে ফিল্টারিং সংগ্রহগুলিতে নীচের হিসাবে প্রডিকেট ব্যবহার করতে পারেন:
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);
Predicate
? কিছু সাদৃশ্য? পুরোপুরি আর কিছু?