存储在引用中接受参数的构造函数

pet*_*rbo 6 java java-8

我上课了

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

sol*_*4me 7

您可以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)

  • 还有`IntFunction`:D (3认同)

aio*_*obe 5

那么什么应该是正确的签名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)