Java 8 带参数的Java 8函数引用

Java 8 带参数的Java 8函数引用,java-8,method-reference,Java 8,Method Reference,试图理解如何引用实例函数。我已经知道如何定义getter,但是setter给我带来了麻烦。我不知道如何为给定的方法签名和给定的基类编写函数 下面是什么类型的Foo::setBar? public class Foo { private String bar; public String getBar() { return bar; } public void setBar(String bar) { this.bar = bar

试图理解如何引用实例函数。我已经知道如何定义getter,但是setter给我带来了麻烦。我不知道如何为给定的方法签名和给定的基类编写函数

下面是什么类型的
Foo::setBar

public class Foo {
    private String bar;

    public String getBar() {
        return bar;
    }

    public void setBar(String bar) {
        this.bar = bar;
    }
}


{
    //Works great!
    Function<Foo, String> func1 = Foo::getBar;

    //Compile error ?
    Function<Foo, String> func2 = Foo::setBar;
    //Compile error ?
    Function<Foo, Void, String> func3 = Foo::setBar;
}
公共类Foo{
私人弦杆;
公共字符串getBar(){
返回杆;
}
公共空心立根杆(弦杆){
这个.bar=bar;
}
}
{
//很好!
函数func1=Foo::getBar;
//编译错误?
函数func2=Foo::setBar;
//编译错误?
函数func3=Foo::setBar;
}

由于
setBar
有一个
void
返回类型,匹配的功能接口单一抽象方法也必须有
void
返回类型。这种功能接口通常被称为“消费者”。在特定情况下,您需要使用接受
Foo
对象和新条形图值的:

BiConsumer<Foo, String> func2 = Foo::setBar;
BiConsumer func2=Foo::setBar;
您的
函数func2=Foo::setBar
是一个编译错误,因为
public void setBar(字符串条)
不是从
Foo
String
的函数,它实际上是从
String
void
的函数

如果要将setter作为方法引用传递,则需要一个BiConsumer,使用
Foo
String

final BiConsumer<Foo, String> setter = Foo::setBar;
Foo foo = new Foo();
final Consumer<String> setBar = foo::setBar;