Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-函数在使用::时是否在内部接收参数?_Java_Java 8 - Fatal编程技术网

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

Java-函数在使用::时是否在内部接收参数?,java,java-8,Java,Java 8,我有些困惑,想澄清我的概念 我们可以这样说: .mapi->Tests.doubleIti 因此,在使用::as时: .mapTests::doubleIt 那么,i参数是否由doubleIt内部接收并在内部传递给doubleIt方法 我们是否可以知道在以下情况下如何接收i并将其传递给doubleIt方法:?映射中的代码调用您传递给它的函数doubleIt直接传递参数,doubleIt将该参数作为其第一个形式参数接收。相反,在lambda版本中,map使用参数调用lambda,lambda接收该

我有些困惑,想澄清我的概念

我们可以这样说:

.mapi->Tests.doubleIti

因此,在使用::as时:

.mapTests::doubleIt

那么,i参数是否由doubleIt内部接收并在内部传递给doubleIt方法

我们是否可以知道在以下情况下如何接收i并将其传递给doubleIt方法:?

映射中的代码调用您传递给它的函数doubleIt直接传递参数,doubleIt将该参数作为其第一个形式参数接收。相反,在lambda版本中,map使用参数调用lambda,lambda接收该参数作为其i参数,然后lambda使用i作为参数调用doubleIt。所以,理论上使用方法参考比使用lambda更直接

因此,doubleIt和doubleIt在内部接收i参数吗 内部传递给doubleIt方法

上面的行读作给定的元素,表示为i,用当前元素作为输入调用doubleIt方法

换句话说,您正在指定应该做什么以及如何做是一个内部实现细节

我们可以知道内部是如何接收i并将其传递给 在以下情况下使用doubleIt方法:

当您通过Tests::doubleIt时,实际上是在传递对doubleIt方法的引用,对于源的每个元素,map方法将调用doubleIt函数,并将当前元素作为输入传递

没什么了

你可能会发现有用的阅读资料:


当您孤立地考虑函数接口类型和流值本身时,会变得更简单。

一方面,假设一个简单的自定义类包含一个整数并具有一个map方法:

这个MyObject类知道它所持有的元素,因此当执行它的map方法时,该类知道在哪里找到函数将作为参数的值。粗略地说,这也是streams使用函数的方式

另一方面,还有一个函数实例的创建,它将被传递给map。 正如您所指出的,您可以使用Tests::doubleIt或i->Tests.doubleIti来提供要映射的参数。在本例中,无论使用哪种方法,结果函数对象都将以相同的方式调用

我想说的是:这两个问题是不同的:MyObject将知道如何为传递给Function.apply的元素提供源代码,而类调用映射将负责提供逻辑。这个逻辑就是函数实例


当你孤立地看待这两个问题时,你的问题的答案就显而易见了。我相信它将有助于实现类似的代码。

如果我们有多个参数会怎么样?@user10796624-情况完全相同。您传入的方法必须与map在map的情况下所期望的方法相匹配,该方法只有一个int类型的形式参数[如果我没有弄错的话]。但是如果您调用的方法需要接受多个参数的回调,那么当它调用该方法时,它会传递多个参数,每个参数一个。所有多个参数都会放在各自的位置,例如p1,p1,p3将是doubleItp1,p2,p3,我是对的吗?@user10796624-当然。这只是一个方法调用。它没有什么特别之处。所有这些都是在内部完成的,不需要做额外的工作,对吗?@user10796624是的,从JDK8开始函数式编程的主要思想是用户只指定内部实现细节的内容和方式。@user10796624欢迎您。添加了一些你可能会觉得有用的博客。最好的:我不知道你所说的内部接收是什么意思。但是map只需要输入一个参数,并返回某个类型。通过编写Tests::doubleIt,编译器在接受一个参数并返回特定类型的测试中搜索名为doubleIt的方法。阅读这篇文章会有所帮助
.map(i -> Tests.doubleIt(i))
class MyObject {
    int value = 0;

    MyObject map(Function<Integer, Integer> f) {
        this.value = f.apply(this.value);
        return this;
    }
}