我有些困惑,想弄清楚我的概念。
让我们说以下几句话:
CancelEvent
因此,将.map(i -> Tests.doubleIt(i))
用作:
::
那么.map(Tests::doubleIt)
参数是否在内部被i
接收并在内部传递给doubleIt
方法?
在doubleIt
的情况下,我们能否知道内部如何接收i
并将其传递给doubleIt
方法?
答案 0 :(得分:3)
map
中的代码调用您传递给它的函数(doubleIt
),并直接向其传递参数,doubleIt
将该参数作为其第一个形式参数。相反,对于您的lambda版本,map
使用参数调用lambda,该参数由lambda作为其i
参数接收,然后您的lambda使用doubleIt
调用i
论据。因此,从理论上讲,使用方法参考比使用lambda更直接。
答案 1 :(得分:1)
所以,doubleIt在内部接收i参数吗? 内部传递给doubleIt方法?
.map(i -> Tests.doubleIt(i))
以上行的内容为“给定一个表示为i
的元素,以当前元素作为输入来调用doubleIt
方法”。
换句话说,您指定“应该做什么”和“应该如何做”是内部实现细节。
我们能知道内部如何接收i并将其传递给 :::
的doubleIt方法
当您传递Tests::doubleIt
时,实际上是在传递对doubleIt
方法的“引用”,对于源中的每个元素,map
方法将调用doubleIt
传递当前元素作为输入的函数。
仅此而已。
您可能会发现有用的读物:
答案 2 :(得分:0)
当您单独考虑功能接口类型和流值本身时,它将变得更加简单。
一方面,假设一个简单的自定义类包含一个整数并具有一个map
方法:
class MyObject {
int value = 0;
MyObject map(Function<Integer, Integer> f) {
this.value = f.apply(this.value);
return this;
}
}
此MyObject
类知道它包含的元素,因此,在执行其map
方法时,该类知道在哪里可以找到该函数将用作参数的值。粗略地说,这也是流使用该功能的方式。
另一方面,创建了一个Function<Integer, Integer>
实例,该实例将传递给map
。
如您所指出的,您可以使用Tests::doubleIt
或i -> Tests.doubleIt(i)
向map
提供参数(在这种情况下,无论哪种方法,最终的Function
对象将以相同的方式调用。)
我要达到的目的:这是两个独立的问题:MyObject
将知道如何传递传递给Function.apply
的元素,而调用map
的类将负责提供逻辑。此“逻辑”是Function
实例。
当您单独查看两者时,您的问题的答案变得显而易见。我相信这将有助于实现类似的代码。