当前位置: 首页 > 知识库问答 >
问题:

使用方法引用代替多参数lambda

康言
2023-03-14

我对“引用特定类型的任意对象的实例方法”背后的概念感到困惑。Oracle留档有一个例子:

String[] stringArray = { "Barbara", "James", "Mary", "John", "Patricia", "Robert", "Michael", "Linda" };
Arrays.sort(stringArray, String::compareToIgnoreCase);

我看到的这种方法参考的大多数示例是这样的:如果lambda像:x-

方法引用String::compareToIgnoreCase的等效lambda表达式将具有形式参数列表(字符串a、字符串b),其中a和b是用于更好地描述此示例的任意名称。方法引用将调用方法a.compareToIgnoreCase(b)。

问题是:对于任何两个参数lambda喜欢(a, b)-

我为我的英语感到抱歉。我希望我把问题说清楚了。


共有3个答案

隆康平
2023-03-14

我的意思是代替(a,b,c)-

是的,没错。

尹兴生
2023-03-14

下面是一个演示实例方法引用行为的小示例。

public class Example {  
    public static void main(String[] args) throws Exception {
        List<String> strings = new ArrayList<String>();
        Example example = new Example();
        Functional methodRef = example::method;
        methodRef.funct("a string", strings);
        System.out.println("List now contains: " + strings);

        Functional lambda = (String s, List<String> l) -> {
            example.method(s, l);
        };
        lambda.funct("another string", strings);
        System.out.println("List now contains: " + strings);
    }

    interface Functional {
        void funct(String value, List<String> list);
    }

    void method(String value, List<String> toAddTo) {
        System.out.println("adding");
        toAddTo.add(value);
    }
}

它打印

adding
List now contains: [a string]
adding
List now contains: [a string, another string]

这两者或多或少是等价的。在lambda的情况下,调用方法的变量需要是有效的final。

伊富
2023-03-14

根据func是静态方法还是实例方法,SomeClass::func可以表示两件事。

(1)如果func是一个静态方法,那么某个类::func是一个lambda,它只是将所有参数传递给方法:

(a, b, c) -> SomeClass.func(a, b, c);

(2)如果func是一个实例方法,那么某个类::func是一个lambda,它使用第一个参数作为实例,如您所想:

(a, b, c) -> a.func(b, c);

其中,a的类型为SomeClass。

编辑:Sotirios的回答演示了另一种不同类型的方法引用:example::method,其中example是一个引用变量(而不是类名)。这与

(a, b) -> example.method(a, b);

或者更准确地说

(a, b) -> __someFinalTemporary.method(a, b);

其中,在评估方法引用的点处,将someFinalTemporary指定给示例,因此如果示例稍后更改,则仍将使用示例的早期值调用该方法。

[第四种是::new,它将参数传递给构造函数。我想这就是全部。]

 类似资料:
  • 问题内容: 我对“引用特定类型的任意对象的实例方法”背后的概念感到困惑。Oracle 文档提供了有关此示例: 我为这种方法参考所见的大多数示例都是这样的:如果lambda是like,那么您可以编写like 。文档中的示例说: 方法参考String :: compareToIgnoreCase的等效lambda表达式将具有形式参数列表(字符串a,字符串b),其中a和b是用于更好地描述此示例的任意名称

  • 是否有可能将方法引用与参数一起使用?我喜欢流的想法,我只是想让代码更易读。 实际上,我认为有一个类似的问题,方法引用了一个参数,我读了,但不知道如何在我的代码中使用bind2方法。这是唯一的解决办法吗?

  • 问题内容: 我刚刚开始学习Java流,并遇到了问题。请看下面的例子。这是Node类的一部分: 我的意图是在流中的每个节点上使用名称和结果参数调用#findChildren。我尝试使用方法引用Node :: findChildren时没有运气。我将不胜感激的解决方案与运营商。 是否可以将方法引用与参数一起使用?我喜欢流的想法,我只想使代码更具可读性。 实际上,我认为还有一个类似的问题,方法引用具有读

  • 问题内容: 在Java 8中,具有以下类 可以通过方法引用来调用setBornTrue方法: 但是我将如何使用forEach方法并通过 方法引用 使用setBorn ?试: 导致错误“无法解析方法setBorn”。 另外,我该如何传递True的值? 问题答案: 使用lambda: 没有发现仅使用Java 8 API的其他方法。 使用此自定义功能: 你可以做: 如果Java API或库中提供了这种实

  • 我通过方法参考获得了关于用lambda替换的声纳信息。但我必须调用字符串上的方法引用???

  • 问题内容: 我已经用Bottle完成了一些编码。这真的很简单,可以满足我的需求。但是,当我尝试将应用程序包装到一个类中时,我很固执: 是否可以在Bottle中使用方法而不是函数? 问题答案: 您的代码不起作用,因为您尝试路由到非绑定方法。非绑定方法没有对的引用,如果尚未创建的实例,怎么办? 如果要路由到类方法,则首先必须初始化类,然后再初始化到该对象上的方法,如下所示: 如果要在处理程序附近添加路