存储接受引用

时间:2015-05-29 16:15:22

标签: java java-8

我有一个班级

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

2 个答案:

答案 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);