2015-05-29 20 views
6

में पैरामीटर स्वीकार करता है मैं एक वर्गस्टोर निर्माता कि संदर्भ

public class Person { 
    private int age; 
} 

और जावा 8 में Supplier का उपयोग कर, मैं

Supplier<Person> personSupplier = Person::new 

की तरह निर्माता संदर्भ स्टोर कर सकते हैं लेकिन मेरे निर्माता पैरामीटर age स्वीकार करता है क्या हुआ अगर

public class Person { 
    private int age; 
    public Person(int age) {this.age = age;} 
} 

अब

Supplier<Person> personSupplier = Person::new 

काम नहीं करता है, तो personSupplier के लिए सही हस्ताक्षर क्या होना चाहिए? जाहिर है मैं कुछ ऐसा कर सकता हूं।

Supplier<Person> personSupplier =() -> new Person(10); 

लेकिन उम्र प्रत्येक व्यक्ति के लिए अलग होना चाहिए, तो यह मेरी समस्या का समाधान नहीं है।

क्या मुझे Supplier के बजाय कुछ और उपयोग करना चाहिए?

उत्तर

7

आप जावा में java.util.function.Function का उपयोग करें और age की आपूर्ति जब apply बुला कर सकते हैं आप के रूप में निम्नानुसार अपने स्वयं के इंटरफेस बनाने के लिए होगा।

उदा।

Function<Integer, Person> personSupplier = Person::new; 
Person p1 = personSupplier.apply(10); 
Person p2 = personSupplier.apply(20); 

कौन सा

Function<Integer, Person> personSupplier = (age) -> new Person(age); 
    Person p1 = personSupplier.apply(10); 
    Person p2 = personSupplier.apply(20); 
+3

भी 'IntFunction': D – ZhongYu

+1

मुझे लगता है कि आपका पहला विकल्प आपके दूसरे की तुलना में अधिक संक्षिप्त है :-) – aioobe

+0

@ bayou.io दाएं :) – sol4me

5

तो personSupplier के लिए सही हस्ताक्षर क्या होना चाहिए?

यह Function<Integer, Person> या IntFunction<Person> होगा।

IntFunction<Person> personSupplier = Person::new; 

Person p = personSupplier.apply(10); // Give 10 as age argument 

फ़ॉलो-अप:

आप इस प्रकार के रूप में उपयोग कर सकते हैं

क्या होगा यदि मैं Person(String name, int age) है?

आप के रूप में ऊपर BiFunction<String, Integer, Person> उसी तरह इस्तेमाल कर सकते हैं।


फ़ॉलो-अप # 2:

क्या होगा यदि मैं Person(String firstName, String lastName, int age) है?

आपको एपीआई में उपयुक्त प्रकार नहीं मिलेगा। उसी तरह

@FunctionalInterface 
interface PersonSupplier { 
    Person supplyPerson(String firstName, String lastName, int age); 
} 

यह तो इस्तेमाल किया जा सकता:

PersonSupplier personSupplier = Person::new; // Assuming a Person has a name 

Person p = personSupplier.supplyPerson("peter", "bo", 10); 
+1

किस बारे में 'BiFunction' के बराबर है? हालांकि 'TriFunction' या' QuadFunction' नहीं, :) – ZhongYu

+0

आह, धन्यवाद। मैं एक और सामान्य जवाब देना चाहता था। :-) उत्तर अपडेट किया गया। – aioobe

+0

अविश्वसनीय, एक 'ObjIntConsumer ' है, लेकिन कोई 'ObjIntBiFunction 'नहीं है। मुझे लगता है, स्पष्टीकरण फिर से है, कि सभी संयोजनों को * एक 'इंटरफ़ेस' विस्फोट से बचने के लिए नहीं बनाया गया था। आप जानते हैं कि कुछ ऐसा पहले से हुआ है ... – Holger

संबंधित मुद्दे