Java-使用:::时,函数是否在内部接收参数?

时间:2018-12-23 11:21:15

标签: java java-8

我有些困惑,想弄清楚我的概念。

让我们说以下几句话:

CancelEvent

因此,将.map(i -> Tests.doubleIt(i))用作:

::

那么.map(Tests::doubleIt)参数是否在内部被i接收并在内部传递给doubleIt方法?

doubleIt的情况下,我们能否知道内部如何接收i并将其传递给doubleIt方法?

3 个答案:

答案 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::doubleIti -> Tests.doubleIt(i)map提供参数(在这种情况下,无论哪种方法,最终的Function对象将以相同的方式调用。)

我要达到的目的:这是两个独立的问题:MyObject将知道如何传递传递给Function.apply的元素,而调用map的类将负责提供逻辑。此“逻辑”是Function实例。

当您单独查看两者时,您的问题的答案变得显而易见。我相信这将有助于实现类似的代码。