2017-08-16 5 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を見てみましょう。

これは、createメソッドの参照に次の方法を示しています。それらのすべてが::トークンを含める

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 = ... 

などの言語をサポートしていません。後でそれを使用してください。しかし、他の複数の場所に一致するかどうかを調べるためには、パラメータの型と戻り値の型を何らかの形で定義する必要があるため、可能であるとも考えません。同じmethod referenceに潜在的に適用されるPredicate<String>およびFunction<String, Boolean>のように。

関連する問題