【问题标题】:How to pass Consumer<String> to the method如何将 Consumer<String> 传递给方法
【发布时间】:2019-02-08 08:33:42
【问题描述】:

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

public ConsumerTestClass(Consumer<String> consumer) {

}

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

}

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

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

作为消费者,我想传递ConsumerTestClass::printString,但为了能够做到这一点,我还需要传递参数,所以看起来像这样:(text) -&gt; ConsumerTestClass.printString(text)。我的问题是......它是传递消费者的唯一选择,还是接受一个参数但不返回任何结果的方法?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    因此,最好将方法引用而不是 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);
        }
    }
    

    最重要的是,当您调用 Consumeraccept 方法时,您必须传入参数,就像在上面的构造函数中所做的那样。

    【讨论】:

      【解决方案2】:

      您可以将其传递为:

      new ConsumerTestClass(ConsumerTestClass::printString);
      

      这是一个方法参考

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

      是传递消费者的唯一选项,还是接受消费者的方法 参数并没有返回结果?

      这取决于您的用例,例如,如果您想传递两个参数但仍然不从它们返回任何内容,您也可以查看 BiConsumer 类。

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

      new ConsumerTestClass(s -> {});
      

      【讨论】:

        猜你喜欢
        • 2012-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-28
        • 1970-01-01
        • 2013-12-04
        • 1970-01-01
        相关资源
        最近更新 更多