2015-08-23 6 views
5

मैं खोज मापदंड के निम्नलिखित नक्शा:पास मापदंडों विधेय को

private final Map<String, Predicate> searchMap = new HashMap<>(); 

private void initSearchMap() { 
    Predicate<Person> allDrivers = p -> p.getAge() >= 16; 
    Predicate<Person> allDraftees = p -> p.getAge() >= 18 
      && p.getAge() <= 25 
      && p.getGender() == Gender.MALE; 
    Predicate<Person> allPilots = p -> p.getAge() >= 23 
      && p.getAge() <=65; 

    searchMap.put("allDrivers", allDrivers); 
    searchMap.put("allDraftees", allDraftees); 
    searchMap.put("allPilots", allPilots); 
} 

मैं निम्नलिखित तरीके से इस नक्शे का उपयोग कर रहा:

pl.stream() 
    .filter(search.getCriteria("allPilots")) 
    .forEach(p -> { 
     p.printl(p.getPrintStyle("westernNameAgePhone")); 
    }); 

मैं जानना चाहूंगा, मैं कैसे कर सकते हैं भविष्यवाणियों के मानचित्र में कुछ पैरामीटर पास करें?

आईई। मैं अपने स्ट्रिंग संक्षेप में मानचित्र से भविष्यवाणी करना चाहता हूं और नक्शा भविष्यवाणी से निकाले गए पैरामीटर को सम्मिलित करना चाहता हूं।

pl.stream() 
    .filter(search.getCriteria("allPilots",45, 56)) 
    .forEach(p -> { 
     p.printl(p.getPrintStyle("westernNameAgePhone")); 
    }); 

यहाँ link से मैं इस नक्शे-विधेय दृष्टिकोण बाहर googled है।

+1

आप करना चाहते हैं क्या होगा संकलित नहीं करें, और आपने यह समझाया नहीं कि यह क्या करना है। –

+0

मैंने अभी एक उदाहरण दिया है। निश्चित रूप से, यह संकलित नहीं होगा। यहां मैं यह करना चाहता हूं: मैं अपने स्ट्रिंग संक्षेप में मानचित्र से भविष्यवाणी करना चाहता हूं और नक्शा भविष्यवाणी से निकाले गए पैरामीटर को सम्मिलित करना चाहता हूं। –

+1

पैरामीटर के लिए क्या उपयोग किया जाएगा? आपके उदाहरण में 45 का लक्ष्य क्या है? –

उत्तर

4

ऐसा लगता है कि आप जो चाहते हैं वह मानचित्र में भविष्यवाणी नहीं करना है। आप जो चाहते हैं वह उस मानचित्र में कुछ स्टोर करने में सक्षम होना है जो int पैरामीटर से Predicate<Person> बनाने में सक्षम है।

Map<String, IntFunction<Predicate<Person>>> searchMap = new HashMap<>(); 

आप इसे उस तरह से भरना था: तो क्या आप चाहते हैं कुछ इस तरह है

searchMap.put("allPilots", maxAge -> 
    (p -> p.getAge() >= 23 
    && p.getAge() <= maxAge)); 

और तुम इस तरह इसका इस्तेमाल woult:

Predicate<Person> allPilotsAgedLessThan45 = 
    searchMap.get("allPilots").apply(45); 
बेशक

, कि होगा यदि आपने अपना स्वयं का फ़ंक्शन इंटरफ़ेस बनाया है तो स्पष्ट हो जाएं:

@FunctionalInterface 
public MaxAgePersonPredicateFactory { 
    Predicate<Person> limitToMaxAge(int maxAge); 
} 

तुम अब भी नक्शा उसी तरह भर जाएगा, लेकिन आप तो थोड़ा अधिक redable कोड होता है, जब उपयोग:

Predicate<Person> allPilotsAgedLessThan45 = 
    searchMap.get("allPilots").limitToMaxAge(45); 
+0

बिल्कुल वही जो मैं खोज रहा था। धन्यवाद! –

+1

यह देखते हुए कि ओपी दो इंट पैराम में गुजरना चाहता है, क्या यह एक इंफंक्शन के बजाय बीआईफ़ंक्शन <इंटीजर, इंटीजर, भविष्यवाणी नहीं होना चाहिए? – KumarM

+0

@ कुमारमार मैंने प्रश्न में दूसरे पैरामीटर को याद किया और केवल 45 को देखा। लेकिन हाँ, अगर उसे दो मानकों की आवश्यकता है, तो कारखाने के हस्ताक्षर को बदलना होगा। –

1

मैं यह समझ के रूप में, आप क्या करना चाहते हैं एक नामित Predicate में कुछ मानदंडों को ओवरराइड है , लेकिन मुझे लगता है कि यह भ्रम पैदा करेगा। अगर मैं भविष्यवाणी की मांग कर रहा हूं जो निर्धारित करता है कि कोई पायलट बनने के योग्य है, तो मैं यह जानना नहीं चाहता कि उस वक्त क्या आवश्यकताएं हैं जब मैं इसे कॉल करता हूं। मक्खी एक Map का उपयोग कर मुश्किल होगा पर

जनरेट कर रहा है विधेय - मुझे लगता है कि चाहते हैं जहां PredicateFactory जटिल वर्ग है जो दिए गए विधेय कुछ मानकों को उत्पन्न करता है किसी प्रकार का है सबसे अच्छा तरीका है के बजाय एक Map<String, PredicateFactory>, के लिए होगा:

Map<String, PredicateFactory<T>> predicates = new HashMap<>(); 

public Predicate<T> get(String name, Object... params) { 
    return predicates.get(name).apply(params); 
} 

मेरे मन, बेहतर तरीका "डायनामिक" विधेय उत्पन्न करने के लिए करने के लिए स्थिर तरीकों के साथ है:

public class PredicatesQuestion { 

    public static void main(String[] args) { 
     List<Person> people = Arrays.asList(new Person(20, Gender.MALE), 
       new Person(45, Gender.FEMALE), new Person(50, Gender.MALE), 
       new Person(65, Gender.MALE)); 

     people.stream() 
       .filter(personIsBetweenAges(16, 25)) 
       .forEach(person -> { 
        System.out.println(person.getAge() + ", " + person.getGender()); 
       }); 
    } 

    private static Predicate<Person> personIsMale() { 
     return person -> person.getGender() == Gender.MALE; 
    } 

    private static Predicate<Person> personIsBetweenAges(int lower, int upper) { 
     return personIsAtLeast(lower).and(personIsYoungerThan(upper)); 
    } 

    private static Predicate<Person> personIsAtLeast(int age) { 
     return person -> person.getAge() >= age; 
    } 

    private static Predicate<Person> personIsYoungerThan(int age) { 
     return person -> person.getAge() < age; 
    } 
} 

यह तो तुच्छ है वर्णनात्मक विधेय बनाने के लिए के रूप में आवश्यक:

private static Predicate<Person> personIsOfDrivingAge() { 
    return personIsAtLeast(17); 
} 

private static Predicate<Person> couldBePilot() { 
    return personIsBetweenAges(23, 65).and(personIsMale()); 

} 

और बात आप कुछ मानकों अधिभावी के साथ प्राप्त करने के लिए कोशिश कर रहे हैं की तरह रचना का एक सा के साथ स्पष्ट रहता है:

people.stream() 
     .filter(couldBePilot().and(personIsBetweenAges(45, 56))) 
     .forEach(person -> { 
      System.out.println(person.getAge() + ", " + person.getGender()); 
     }); 
संबंधित मुद्दे