2017-08-16 94 views
27

当在Java中使用地图功能我可以做到以下几点:如何在静态导入中使用方法引用?

import com.example.MyClass; 

someStream.map(MyClass::myStaticMethod) 

但在我的项目中,我们有时会使用静态导入,我怎么可以参考myStaticMethod当进口是静态的?

我认为这会工作,但它并不:

import static com.example.MyClass.myStaticMethod; 

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

为什么这个不行?我是用第一个例子“卡住”的还是有其他解决方案。

回答

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

+1

通过引用JLS思考问题的好方法!但是map也可以处理其他参数,比如lambda也没有::。是否有更抽象的类型来表示地图将作为参数接受的内容?哪一个会 – Xeli

3

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

所以,如果你想要的工作,它应该长得一模一样,就像引入静态导入前:

MyClass::myStaticMethod 
-2

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

4

那么它不会编译,因为JLS这样说。但是这不能编译,因为它将是一个简单的方法调用而不是方法参考 - 它只是使用::表示法定义的,不管它是一个静态的或在其上使用的实例。

这仍然是一个有趣的方面,你不能解决的一个 - 可能在目前。没有语言支持来定义类似的东西:

MethodRef <Class, Method> ref = ... 

然后以您希望的方式使用它。但我甚至不认为这是可能的,因为你也必须以某种方式定义参数类型和返回类型,因为需要它来查看它是否与多个其他地方相匹配。像Predicate<String>Function<String, Boolean>这可能适用于相同的method reference

相关问题