有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何将使用者<String>传递给方法

所以我有这样的代码:

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)。我的问题是。。。它是传递消费者的唯一选项,还是接受一个参数而不返回结果的方法


共 (2) 个答案

  1. # 1 楼答案

    方法引用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);
        }
    }
    

    底线是,在调用Consumeraccept方法时,必须传入参数,就像在上面的构造函数中所做的那样

  2. # 2 楼答案

    您可以将其传递为:

    new ConsumerTestClass(ConsumerTestClass::printString);
    

    这是一个方法参考

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

    Is it only option to pass Consumer, or method which is accepting one argument and returning no results?

    这取决于您的用例,例如,如果您希望传递两个参数,但仍然不从它们返回任何内容,那么您也可以查看^{}

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

    new ConsumerTestClass(s -> {});