如何在静态导入中使用方法引用?



在java中使用map函数时,我可以执行以下操作:

import com.example.MyClass;
someStream.map(MyClass::myStaticMethod)

但是在我的项目中,我们有时会使用静态导入,当导入是静态时,我如何引用 myStaticMethod?

我认为这会起作用,但它没有:

import static com.example.MyClass.myStaticMethod;
someStream.map(myStaticMethod); //does not compile

为什么这不起作用?我是否"卡住了"使用第一个示例,或者还有其他解决方案。

让我们看一下 Java 语言规范 15.13 的相关部分。方法引用表达式。

它列出了以下创建方法引用的方法:

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

好吧,它不会编译,因为JLS是这样说的。但这甚至无法编译,因为它将是一个普通的方法调用而不是方法引用- 它仅使用::表示法定义,无论是静态还是实例使用。

这仍然是一个有趣的方面,一个你无法解决的方面 - 可能是目前。没有语言支持来定义以下内容:

MethodRef <Class, Method> ref = ...

然后按照您想要的方式使用它。但我什至认为这是不可能的,因为您还必须以某种方式定义参数类型和返回类型,因为需要这样做才能查看它是否与多个其他地方匹配。就像Predicate<String>Function<String, Boolean>一样,这可能适用于同一method reference

方法的静态导入不会影响定义方法引用的方式。

因此,如果您希望它工作,它看起来应该与引入静态导入之前完全相同:

MyClass::myStaticMethod

使用方法的静态导入,您只能调用它,而不能引用它。对于 stream((.map((,它需要对函数的引用,以便它可以为每个条目调用它。

最新更新