当前位置: 首页 > 面试题库 >

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

丁学
2023-03-14
问题内容

我对“引用特定类型的任意对象的实例方法”背后的概念感到困惑。Oracle
文档提供了有关此示例:

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

我为这种方法参考所见的大多数示例都是这样的:如果lambda是like,x -> x.func()那么您可以编写like
ClassOfX::func。文档中的示例说:

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

问题是:对于像(a, b) -> a.func(b)func方法这样的两个参数,lambda
必须是第一个参数的实例方法,而lambda的第二个参数将作为该方法的参数传递?如果我们有多个参数lambda,则func方法必须是lambda
的第一个参数的实例方法,而lambda的其他参数将按func在lambda中出现的顺序传递给?我的意思是代替(a, b, c) -> a.func(b, c)我们可以写ClassOfA::func

我的英语不好意思。我希望我能解决这个问题。


问题答案:

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

(1)如果func是静态方法,则SomeClass::func是仅将所有参数传递给方法的lambda:

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

(2)如果func是实例方法,则SomeClass::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);

在评估方法引用的位置将where
__someFinalTemporary分配给example,因此,如果example以后更改,仍将使用的早期值调用该方法example

[第四种是SomeClass::new将参数传递给构造函数。我认为这就是全部。]



 类似资料:
  • 我对“引用特定类型的任意对象的实例方法”背后的概念感到困惑。Oracle留档有一个例子: 我看到的这种方法参考的大多数示例是这样的:如果lambda像:

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

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

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

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

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