Java 将函数引用作为参数传递

Java 将函数引用作为参数传递,java,lambda,functional-programming,java-8,Java,Lambda,Functional Programming,Java 8,是否可以将对方法的引用作为参数传递 例如: public static void main(String[] args) { String data = "name: John, random text, address: leetStreet"; Person person; //if regex matches, use method reference, to send the result. applyDataToPerson(data, "name:

是否可以将对方法的引用作为参数传递

例如:

public static void main(String[] args) {
    String data = "name: John, random text, address: leetStreet";
    Person person;

    //if regex matches, use method reference, to send the result. 
    applyDataToPerson(data, "name: (\\w+)", person, Person::setName);
    applyDataToPerson(data, "address: (\\w+)", person, Person::setAddress);
}

private static void applyDataToPerson(String data, String regex, Person person, 
 Function<Person> f) {
    Matcher match = Pattern.compile(regex).matcher(data);
    if (match.matches()) person.f(match.group(1));
}

class Person {
    private String name;
    private String address;

    public void setName(String name) {
        this.name = name;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}
publicstaticvoidmain(字符串[]args){
String data=“名称:John,随机文本,地址:leetStreet”;
个人;
//如果正则表达式匹配,则使用方法引用发送结果。
applyDataToPerson(数据,“名称:(\\w+)”,person,person::setName);
applyDataToPerson(数据,“地址:(\\w+)”,person,person::setAddress);
}
私有静态void applyDataToPerson(字符串数据、字符串正则表达式、Person、,
函数f){
Matcher match=Pattern.compile(regex).Matcher(data);
if(match.matches())person.f(match.group(1));
}
班主任{
私有字符串名称;
私有字符串地址;
公共void集合名(字符串名){
this.name=名称;
}
公共无效设置地址(字符串地址){
this.address=地址;
}
}

如果没有,除了引用方法,还有什么替代方法?开关盒构造?

我想您正在寻找:


我想你在寻找:


在Java8中,您可以访问现有方法(除其他外)@Tibrogargan方法签名是什么样子的<代码>比较器
函数
应该代表什么?如果我们说的是,它有2个泛型类型,而不是1个。这样代码就不能编译了。。。(更不用说
person.f(…)
)。在寻求替代方案之前,请确保您有可用的代码……在Java8中,您可以将现有的方法(除其他外)@Tibrogargan方法签名是什么样子的<代码>比较器
函数
应该代表什么?如果我们说的是,它有2个泛型类型,而不是1个。这样代码就不能编译了。。。(更不用说
person.f(…)
)。在询问替代方案之前,请确保您有工作代码…并在主方法中编写biconsumer函数:
applyDataToPerson(数据,“name:(\\w+)”,person,(person p,String s)->p.setName(s));applyDataToPerson(数据,“地址:(\\w+)”,person,(person p,字符串s)->p.setAddress(s))
@gaston否,主方法与OP完全相同。我个人喜欢第二个选项。在主方法中编写biconsumer函数:
applyDataToPerson(数据,“name:(\\w+)”,person,(person p,String s)->p.setName(s));applyDataToPerson(数据,“地址:(\\w+)”,person,(person p,字符串s)->p.setAddress(s))
@gaston不,主要方法与OP完全一样。我个人喜欢第二种方法。
private static void applyDataToPerson(String data, String regex, Person person, BiConsumer<Person, String> action) {
    Matcher match = Pattern.compile(regex).matcher(data);
    if (match.matches()) action.accept(person, match.group(1));
}
public static void main(String[] args) {
    String data = "name: John, random text, address: leetStreet";
    Person person;

    //if regex matches, use method reference, to send the result. 
    applyData(data, "name: (\\w+)", person::setName);
    applyData(data, "address: (\\w+)", person::setAddress);
}

private static void applyData(String data, String regex, Consumer<String> action) {
    Matcher match = Pattern.compile(regex).matcher(data);
    if (match.matches()) action.accept(match.group(1));
}