如何通过消费者 方法

问题描述 投票:4回答:2

所以我有这样的代码:

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的方法,或接受一个参数并且没有返回结果的方法?

java java-8 java-stream functional-interface
2个回答
3
投票

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

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

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

所以更喜欢方法引用lambdas作为一种好习惯。

这是完全有效的例子。

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);
    }
}

最重要的是,当你在上面的构造函数中调用acceptConsumer方法时,你必须传入参数。


2
投票

您可以将其传递为:

new ConsumerTestClass(ConsumerTestClass::printString);

这是一个方法参考

new ConsumerTestClass(x -> ConsumerTestClass.printString(x));

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

这取决于你的用例,例如,如果你想传递两个参数但仍然没有从它们返回任何东西,你也可以查看BiConsumer类。

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

new ConsumerTestClass(s -> {});
© www.soinside.com 2019 - 2024. All rights reserved.