जावा में समर्पित करें


100

मैं उस कोड से गुजर रहा हूं जो Predicateजावा में उपयोग करता है। मैंने कभी इस्तेमाल नहीं किया Predicate। क्या कोई मुझे Predicateजावा के किसी भी ट्यूटोरियल या वैचारिक स्पष्टीकरण और इसके कार्यान्वयन के लिए मार्गदर्शन कर सकता है ?


4
क्या आप अमरूद की बात कर रहे हैं Predicate? कुछ समान? पूरी तरह से कुछ और?
पॉलीजेन लुब्रिकेंट्स 5

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, परिभाषित करके , filterएक-का उपयोग करके Predicate

एपीआई लिंक

  • 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
मैं अमरूद के प्रेडिकेट का उल्लेख नहीं कर रहा था, मुझे अपने प्रश्न में स्पष्ट होना चाहिए था। लेकिन आपके स्पष्टीकरण से मुझे यह समझने में मदद मिली कि मैं क्या खोज रहा था, जिस तरह से जावा में विधेय तर्क का उपयोग किया जाता है। विस्तृत विवरण के लिए धन्यवाद
श्रीकांत

@ पॉलीऑक्सिहाइडेलेबुलेंट, क्यों आविष्कार Predicate<Integer>करते हैं जब हमारे पास पहले से ही है F<Integer, Boolean>जो सटीक एक ही काम करता है?
पचेरियर

आप इसे java 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;
     }
}

एक बेहतर वैचारिक समझ पाने के लिए, आप पहले क्रम के तर्क के बारे में पढ़ना चाह सकते हैं।

संपादित
एक मानक नहीं है विधेय इंटरफेस ( 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

मिचेल ने जो कहा है उसे जोड़कर :

जावा में फ़िल्टरिंग संग्रह में निम्नानुसार आप 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);

1
मूल रूप से इस तरह की हार का उद्देश्य नहीं है? एक कार्यात्मक दृष्टिकोण चुनने का मुख्य कारण मैन्युअल रूप से पुनरावृत्ति नहीं करना और इसके लिए छुटकारा पाना है। अमूर्तता का स्तर उच्च और अधिक शक्तिशाली हो जाता है - हालाँकि इसके लिए मैन्युअल रूप से करना उस उद्देश्य को हरा देता है और निम्न स्तर के अमूर्त में वापस आ जाता है।
यूजेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.