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

我对“引用特定类型的任意对象的实例方法”背后的概念感到困惑。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将参数传递给构造函数。我认为这就是全部。]

以上是 使用方法引用代替多参数lambda 的全部内容, 来源链接: utcz.com/qa/408863.html

回到顶部