मैं उस कोड से गुजर रहा हूं जो 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;
}
}
एक बेहतर वैचारिक समझ पाने के लिए, आप पहले क्रम के तर्क के बारे में पढ़ना चाह सकते हैं।
संपादित
एक मानक नहीं है विधेय इंटरफेस ( 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);
मिचेल ने जो कहा है उसे जोड़कर :
जावा में फ़िल्टरिंग संग्रह में निम्नानुसार आप Predicate का उपयोग कर सकते हैं:
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
? कुछ समान? पूरी तरह से कुछ और?