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

时间:2017-08-16 06:38:12

标签: java lambda java-8 method-reference

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

import com.example.MyClass;

someStream.map(MyClass::myStaticMethod)

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

我认为这会有效,但事实并非如此:

import static com.example.MyClass.myStaticMethod;

someStream.map(myStaticMethod); //does not compile

为什么这不起作用?我是否“使用第一个例子”或者还有其他解决方案。

4 个答案:

答案 0 :(得分:29)

让我们看一下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。< / p>

答案 1 :(得分:4)

好吧它没有编译,因为JLS这么说。但是这甚至无法编译,因为它将是一个简单的方法调用而不是方法引用 - 它仅使用::表示法定义,不管它使用静态或实例。

这是一个有趣的方面,你无法解决的问题 - 可能就在此刻。没有语言支持来定义类似的内容:

MethodRef <Class, Method> ref = ...

后来按照你想要的方式使用它。但我甚至认为这是不可能的,因为您还必须以某种方式定义参数类型和返回类型,因为这需要查看它是否与其他多个位置匹配。与可能适用于同一Predicate<String>的{​​{1}}和Function<String, Boolean>一样。

答案 2 :(得分:3)

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

所以,如果你想让它工作,它应该看起来完全像引入静态导入之前一样:

MyClass::myStaticMethod

答案 3 :(得分:-2)

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