¿Qué hace el operador de flecha '->' en Java?

171

Mientras buscaba algún código me encontré con el operador de flecha, ¿qué hace exactamente? Pensé que Java no tenía un operador de flecha.

return (Collection<Car>) CollectionUtils.select(listOfCars, (arg0) -> {
        return Car.SEDAN == ((Car)arg0).getStyle();
});

Detalles : Java 6, Apache Commons Collection, IntelliJ 12

Actualización / Respuesta: Resulta que IntelliJ 12 es compatible con Java 8, que es compatible con lambdas, y está predicando "plegando" y mostrándolos como lambdas. A continuación se muestra el código "sin plegar".

return (Collection<Car>) CollectionUtils.select(listOfCars, new Predicate() {
    public boolean evaluate(Object arg0) {
        return Car.SEDAN == ((Car)arg0).getStyle();
    }
});
Mike Rylander
fuente
55
Tenga en cuenta que el escenario exacto es IntelliJ que representa el código existente como una expresión lambda para que sea más fácil de leer. El código real no es una expresión lambda.
Thorbjørn Ravn Andersen

Respuestas:

125

Eso es parte de la sintaxis de las nuevas expresiones lambda, que se introducirán en Java 8. Hay un par de tutoriales en línea para familiarizarse, aquí hay un enlace a uno. Básicamente, ->separa los parámetros (lado izquierdo) de la implementación (lado derecho).

La sintaxis general para usar expresiones lambda es

(Parámetros) -> {Body} donde '->' separa los parámetros y el cuerpo de la expresión lambda.

Los parámetros están encerrados entre paréntesis, de la misma manera que para los métodos, y el cuerpo de la expresión lambda es un bloque de código encerrado entre llaves.

Óscar López
fuente
10
El OP utiliza JDK 6, por lo que esto es realmente solo el código plegable IntelliJ según la respuesta de @antonm a continuación
Sean Landsman,
66
@SeanLandsman OP podría estar usando Java 6, pero en la pregunta afirma que encontró ese código en otro lugar. En cuanto a por qué IntelliJ no está reportando un error, que es un misterio (tal vez no es una versión de Java 7 instalado en algún lugar en el sistema de OP). Pero esa es la sintaxis de una expresión lambda en Java, no hay duda al respecto.
Óscar López
37

Este también es útil cuando desea implementar una interfaz funcional

Runnable r = ()-> System.out.print("Run method");

es equivalente a

Runnable r = new Runnable() {
            @Override
            public void run() {
                System.out.print("Run method");
            }
        };
Justin Patel
fuente
¿Por qué se proporciona esta función?
Akaisteph7
1
@ Akaisteph7 cuando no desea definir un método porque descubre que solo una persona que llama va a llamar a ese método. En esos casos, tiene sentido NO definir el método en un lugar separado, sino pasarlo al cuerpo del método, leer sobre el método anónimo seguido de lambda.
Vivek Shukla
30

Creo que esta flecha existe debido a su IDE. IntelliJ IDEA hace tal cosa con algún código. Esto se llama código plegable. Puede hacer clic en la flecha para expandirla.

Anton-M
fuente
36
@DavidConrad No, no está mal. De hecho, IntelliJ dobla las implementaciones en línea de interfaces funcionales para que parezcan lambdas.
balpha
12
Mire la pregunta: "Detalles: Java 6, Colección Apache Commons, IntelliJ 12" Lambda en Java 6 ???
Anton-M
13

Es una expresión lambda.

Significa que, de listOfCars, arg0 es uno de los elementos de esa lista. Con ese ítem que va a hacer, de ahí el ->, lo que sea que esté dentro de los corchetes.

En este ejemplo, devolverá una lista de autos que se ajustan a la condición

Car.SEDAN == ((Car)arg0).getStyle();
simple-thomas
fuente