Java 8 带参数的函数引用

Java 8 Function Reference With Arguments

试图了解如何引用实例函数。我已经弄清楚如何定义 getter,但是 setter 给我带来了麻烦。我不确定如何为给定的方法签名和给定的基数编写函数 class.

下面的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;
}

由于setBarvoidreturn类型,匹配的功能接口单一抽象方法也必须有voidreturn类型。此类功能接口通常称为 "consumers"。在您的特定情况下,您需要使用 BiConsumer 接受一个 Foo 对象和一个新的柱值:

BiConsumer<Foo, String> func2 = Foo::setBar;

你的Function<Foo, String> func2 = Foo::setBar;是编译错误,因为public void setBar(String bar)不是FooString的函数,它实际上是String的函数至 Void.

如果你想传递 setter 作为方法引用,你需要一个 BiConsumer,需要一个 Foo 和一个 String like

final BiConsumer<Foo, String> setter = Foo::setBar;

或者如果你已经有一个 foo 的实例,你可以简单地使用它并使用 Consumer,例如

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