如何在静态导入中使用方法引用?
How to use a method reference on a static import?
在 java 中使用地图函数时,我可以执行以下操作:
import com.example.MyClass;
someStream.map(MyClass::myStaticMethod)
但是在我的项目中,我们有时会使用静态导入,当导入是静态时,如何引用 myStaticMethod?
我认为这行得通,但行不通:
import static com.example.MyClass.myStaticMethod;
someStream.map(myStaticMethod); //does not compile
为什么这不起作用?我 'stuck' 使用第一个示例还是有其他解决方案。
让我们看看Java语言规范的相关部分,15.13. Method Reference Expressions。
它列出了以下创建方法参考的方法:
MethodReference:
ExpressionName :: [TypeArguments] Identifier
ReferenceType :: [TypeArguments] Identifier
Primary :: [TypeArguments] Identifier
super :: [TypeArguments] Identifier
TypeName . super :: [TypeArguments] Identifier
ClassType :: [TypeArguments] new
ArrayType :: new
请注意,所有这些都包含一个 ::
令牌。
由于 someStream.map(myStaticMethod)
的参数不包含 ::
,因此它不是有效的方法引用。
这表明您确实需要导入 MyClass
(也许 除了 静态导入,如果这是您的偏好)并将该方法称为 MyClass::myStaticMethod
.
静态导入方法不会影响您定义方法引用的方式。
所以,如果你想让它工作,它应该看起来和引入静态导入之前完全一样:
MyClass::myStaticMethod
静态导入方法只能调用不能引用。对于 stream().map() 它需要一个函数的引用以便它可以为每个条目调用它。
嗯,它没有编译,因为 JLS 是这么说的。但这甚至无法编译,因为它是一个普通的 方法调用 而不是 方法引用 - 仅使用 [=11 定义=] 符号,无论是静态还是实例使用。
这仍然是一个有趣的方面,一个你无法解决的问题 - 可能是现在。没有语言支持来定义如下内容:
MethodRef <Class, Method> ref = ...
然后按照您想要的方式使用它。但我什至认为那是不可能的,因为您还必须以某种方式定义参数类型和 return 类型,因为这需要查看它是否与其他多个地方匹配。就像 Predicate<String>
和 Function<String, Boolean>
可能适用于相同的 method reference
。
在 java 中使用地图函数时,我可以执行以下操作:
import com.example.MyClass;
someStream.map(MyClass::myStaticMethod)
但是在我的项目中,我们有时会使用静态导入,当导入是静态时,如何引用 myStaticMethod?
我认为这行得通,但行不通:
import static com.example.MyClass.myStaticMethod;
someStream.map(myStaticMethod); //does not compile
为什么这不起作用?我 'stuck' 使用第一个示例还是有其他解决方案。
让我们看看Java语言规范的相关部分,15.13. Method Reference Expressions。
它列出了以下创建方法参考的方法:
MethodReference:
ExpressionName :: [TypeArguments] Identifier
ReferenceType :: [TypeArguments] Identifier
Primary :: [TypeArguments] Identifier
super :: [TypeArguments] Identifier
TypeName . super :: [TypeArguments] Identifier
ClassType :: [TypeArguments] new
ArrayType :: new
请注意,所有这些都包含一个 ::
令牌。
由于 someStream.map(myStaticMethod)
的参数不包含 ::
,因此它不是有效的方法引用。
这表明您确实需要导入 MyClass
(也许 除了 静态导入,如果这是您的偏好)并将该方法称为 MyClass::myStaticMethod
.
静态导入方法不会影响您定义方法引用的方式。
所以,如果你想让它工作,它应该看起来和引入静态导入之前完全一样:
MyClass::myStaticMethod
静态导入方法只能调用不能引用。对于 stream().map() 它需要一个函数的引用以便它可以为每个条目调用它。
嗯,它没有编译,因为 JLS 是这么说的。但这甚至无法编译,因为它是一个普通的 方法调用 而不是 方法引用 - 仅使用 [=11 定义=] 符号,无论是静态还是实例使用。
这仍然是一个有趣的方面,一个你无法解决的问题 - 可能是现在。没有语言支持来定义如下内容:
MethodRef <Class, Method> ref = ...
然后按照您想要的方式使用它。但我什至认为那是不可能的,因为您还必须以某种方式定义参数类型和 return 类型,因为这需要查看它是否与其他多个地方匹配。就像 Predicate<String>
和 Function<String, Boolean>
可能适用于相同的 method reference
。