2015-05-29 9 views
6

Mam klasykonstruktor sklepie, który akceptuje parametr w odniesieniu

public class Person { 
    private int age; 
} 

i korzystania Supplier w Java 8, można przechowywać odniesienie konstruktora jak

Supplier<Person> personSupplier = Person::new 

Ale co, jeśli mój konstruktor przyjmuje parametr age jak

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

Teraz

Supplier<Person> personSupplier = Person::new 

nie działa, więc co powinno być poprawny podpis na personSupplier? Oczywiście mogę zrobić coś takiego.

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

Jednak wiek musi być różny dla każdej osoby, więc nie rozwiązuje mojego problemu.

Może powinienem użyć czegoś innego zamiast Supplier?

Odpowiedz

7

Można użyć java.util.function.Function w Javie i dostarczamy age Dzwoniąc apply.

E.g.

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

co jest równoważne

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

również 'IntFunction': D – ZhongYu

+1

Myślę, że twoja pierwsza alternatywa jest bardziej zwięzła niż twoja druga :-) – aioobe

+0

@ bayou.io Właściwie :) – sol4me

5

Jaki powinien być poprawny podpis dla personSupplier?

To będzie Function<Integer, Person> lub IntFunction<Person>.

Można go używać w następujący sposób:

IntFunction<Person> personSupplier = Person::new; 

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

Kontynuacja:

Co jeśli mam Person(String name, int age)?

Można użyć BiFunction<String, Integer, Person> w taki sam sposób jak powyżej.


Follow-up # 2:

Co jeśli mam Person(String firstName, String lastName, int age)?

Nie znajdziesz odpowiedniego typu w interfejsie API. Trzeba by stworzyć swój własny interfejs, co następuje:

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

To może być następnie wykorzystane w taki sam sposób:

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

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

co o 'BiFunction'? no 'TriFunction' lub' QuadFunction' chociaż, :) – ZhongYu

+0

Ah, dzięki. Chciałem udzielić bardziej ogólnej odpowiedzi. :-) Odpowiedź zaktualizowana. – aioobe

+0

Niewiarygodne, istnieje 'ObjIntConsumer ', ale nie ma 'ObjIntBiFunction '. Przypuszczam, że wyjaśnienie brzmi ponownie, że nie wszystkie kombinacje zostały stworzone, aby * uniknąć * eksplozji "interfejsu". Wiesz, żeby uniknąć czegoś, co już się stało ... – Holger

Powiązane problemy