我上课了
public class Person {
private int age;
}
Run Code Online (Sandbox Code Playgroud)
并且Supplier在java 8中使用,我可以存储构造函数引用
Supplier<Person> personSupplier = Person::new
Run Code Online (Sandbox Code Playgroud)
但是如果我的构造函数接受age像这样的参数呢
public class Person {
private int age;
public Person(int age) {this.age = age;}
}
Run Code Online (Sandbox Code Playgroud)
现在
Supplier<Person> personSupplier = Person::new
Run Code Online (Sandbox Code Playgroud)
不起作用,那么什么应该是正确的签名personSupplier?显然我可以做点什么.
Supplier<Person> personSupplier = () -> new Person(10);
Run Code Online (Sandbox Code Playgroud)
但是每个人的年龄必须不同,所以它不能解决我的问题.
可能是我应该用别的而不是Supplier?
您可以java.util.function.Function在Java 中使用并age在调用时提供apply.
例如
Function<Integer, Person> personSupplier = Person::new;
Person p1 = personSupplier.apply(10);
Person p2 = personSupplier.apply(20);
Run Code Online (Sandbox Code Playgroud)
这相当于
Function<Integer, Person> personSupplier = (age) -> new Person(age);
Person p1 = personSupplier.apply(10);
Person p2 = personSupplier.apply(20);
Run Code Online (Sandbox Code Playgroud)
那么什么应该是正确的签名
personSupplier?
那将是Function<Integer, Person>或IntFunction<Person>.
您可以按如下方式使用它:
IntFunction<Person> personSupplier = Person::new;
Person p = personSupplier.apply(10); // Give 10 as age argument
Run Code Online (Sandbox Code Playgroud)
跟进:
如果我有
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);
}
Run Code Online (Sandbox Code Playgroud)
然后可以使用相同的方式:
PersonSupplier personSupplier = Person::new; // Assuming a Person has a name
Person p = personSupplier.supplyPerson("peter", "bo", 10);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
261 次 |
| 最近记录: |