usar tipos referencia programacion por métodos metodos estáticos estaticos cuando creación java lambda java-8 method-reference

java - tipos - static programacion



¿Cómo usar una referencia de método en una importación estática? (4)

Cuando uso funciones de mapa en java, puedo hacer lo siguiente:

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

pero en mi proyecto a veces usamos importaciones estáticas, ¿cómo puedo hacer referencia al myStaticMethod cuando la importación es estática?

Yo pensaría que esto funcionaría pero no:

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

¿Por qué esto no funciona? ¿Estoy "atrapado" con el uso del primer ejemplo o hay otras soluciones?


Bueno, no compila porque el JLS lo dice. Pero eso ni siquiera puede compilarse, ya que sería una invocación de método simple y no una referencia de método , que se define ÚNICAMENTE utilizando la notación :: , ya sea una estática o instancia utilizada en.

Es un aspecto interesante aún, uno que no puede resolver, puede ser en este momento. No hay soporte de idiomas para definir algo como:

MethodRef <Class, Method> ref = ...

Y luego usa eso de la manera que quieras. Pero ni siquiera creo que eso sea posible, porque también tendría que definir los tipos de parámetros y el tipo de retorno de alguna manera, porque esto sería necesario para ver si coincide con otros muchos lugares. Como Predicate<String> y Function<String, Boolean> que se aplicarían potencialmente a la misma method reference .


Con una importación estática de un método, solo puede llamar pero no hacer referencia a él. Para stream (). Map () necesita una referencia a una función para que pueda invocarla para cada entrada.


Veamos la parte relevante de la Especificación del lenguaje Java, 15.13. Expresiones de referencia del método .

Enumera las siguientes formas de crear una referencia de método:

MethodReference: ExpressionName :: [TypeArguments] Identifier ReferenceType :: [TypeArguments] Identifier Primary :: [TypeArguments] Identifier super :: [TypeArguments] Identifier TypeName . super :: [TypeArguments] Identifier ClassType :: [TypeArguments] new ArrayType :: new

Tenga en cuenta que todos ellos incluyen un :: token.

Como el argumento de someStream.map(myStaticMethod) no incluye :: , no es una referencia de método válida.

Esto sugiere que necesita importar MyClass (tal vez además de la importación estática, si esa es su preferencia) y hacer referencia al método como MyClass::myStaticMethod .


Tener una importación estática de un método no influye en la forma en que define una referencia de método.

Entonces, si quiere que funcione, debería verse exactamente igual que antes de introducir la importación estática:

MyClass::myStaticMethod