如何将Consumer <string>传递给方法

时间:2019-02-08 08:33:43

标签: java java-8 java-stream functional-interface

所以我确实有这样的代码:

public ConsumerTestClass(Consumer<String> consumer) {

}

public static void printString(String text) {
    System.out.println(text);

}

从其他类的方法中,我想创建ConsumerTestClass的对象:

new ConsumerTestClass(/*passing consumer here*/);

作为消费者,我想传递ConsumerTestClass::printString,但是要做到这一点,我还需要传递参数,因此看起来像这样:(text) -> ConsumerTestClass.printString(text)。我的问题是...是传递Consumer的唯一选择,还是接受一个参数且不返回任何结果的方法?

2 个答案:

答案 0 :(得分:3)

方法引用ConsumerTestClass::printString只是等效的lambda表达式text -> ConsumerTestClass.printString(text)的语法糖

方法引用不能用于任何方法。它们只能用于替换单方法lambda表达式。通常,我们不必将参数传递给方法引用。在这种情况下,由方法printString获取的参数将自动传递到幕后。

方法引用提供了一种生成比lambda更简洁的函数对象的方法。

因此,最好将对lambda的方法引用作为一种好习惯。

这是完整的示例。

public class ConsumerTestClass {
    public ConsumerTestClass(Consumer<String> consumer) {
        consumer.accept("Test");
    }

    public static void printString(String text) {
        System.out.println(text);

    }

    public static void main(String[] args) {
        new ConsumerTestClass(ConsumerTestClass::printString);
    }
}

最重要的是,您必须像上面的构造函数一样在调用accept的{​​{1}}方法时传递参数。

答案 1 :(得分:2)

您可以将其传递为:

new ConsumerTestClass(ConsumerTestClass::printString);

这是

的方法参考
new ConsumerTestClass(x -> ConsumerTestClass.printString(x));
  

是传递使用者的唯一选择,还是接受一个的方法   参数并没有返回结果?

这取决于您的用例,例如,如果您想传递两个参数并且仍然不返回任何参数,则也可以查看BiConsumer类。

注意 :在特殊情况下,当您不想对提供的Consumer执行任何操作时,可以选择将其定义为no -op lambda,如:

new ConsumerTestClass(s -> {});