5

我目前正在做这个项目。它的效果出奇的好。

然而,在再次阅读自述文件后,我开始想知道如何记录困扰我的东西......

引用这个例子,暂时忘记可以抛出异常,它是这样写的:

Files.list(somePath).map(Path::toRealPath).forEach(System.out::println)

好的。现在,Path涉及的方法就是这个。当然,我们不通过任何LinkOption.

再说一遍:让我们暂时忘记它会引发任何异常。

Stream.map()以 aFunction作为参数。这个接口,对于Function<T, R>,被定义为:

R apply(T t);

但是我使用的方法不接受任何参数。乍一看,它似乎与 a 不匹配Function,对吧?除了那个...

它可以写成:

path -> path.toRealPath()

因此,如果方法引用没有参数或类似的东西,看起来所使用的机制在某种程度上能够调用“流对象”上的方法......

我想相应地记录这一点,我在这里遗漏了一些东西。

我错过了什么?

4

1 回答 1

3

非静态方法将接收者 ( this) 对象作为隐式的第一个参数。因此,Class::nonStaticMethod比您预期的要多一个参数。

Java 语言规范第 15.13.1 节,方法参考的编译时声明

  • 其次,给定具有n 个参数的目标函数类型,确定了一组可能适用的方法:

    • 如果方法引用表达式的格式为ReferenceType :: [TypeArguments] Identifier,则可能适用的方法是要搜索的类型的成员方法,这些方法具有适当的名称(由Identifier给出)、可访问性、arity(nn-1)和类型参数 arity(派生自[TypeArguments]),如 §15.12.2.1 中所述。

      考虑了两个不同的元数,n 和 n-1,以说明这种形式指代static方法或实例方法的可能性。

于 2014-12-24T06:34:48.807 回答