我有一个班级
public class Person {
private int age;
}
在java 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
?
答案 0 :(得分:7)
您可以在Java中使用java.util.function.Function
并在调用age
时提供apply
。
E.g。
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);
答案 1 :(得分: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)
怎么办?
您在API中找不到合适的类型。您必须按如下方式创建自己的界面:
@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);