使用方法引用代替多参数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