Que fait l'opérateur de flèche «->» en Java?

171

En parcourant du code, je suis tombé sur l'opérateur flèche, que fait-il exactement? Je pensais que Java n'avait pas d'opérateur de flèche.

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

Détails : Java 6, Apache Commons Collection, IntelliJ 12

Mise à jour / Réponse: Il s'avère qu'IntelliJ 12 prend en charge Java 8, qui prend en charge les lambdas, et «plie» les prédicats et les affiche en tant que lambdas. Voici le code "non plié".

return (Collection<Car>) CollectionUtils.select(listOfCars, new Predicate() {
    public boolean evaluate(Object arg0) {
        return Car.SEDAN == ((Car)arg0).getStyle();
    }
});
Mike Rylander
la source
5
Notez que le scénario exact est qu'IntelliJ rend le code existant sous la forme d'une expression lambda pour le rendre plus facile à lire. Le code réel n'est pas une expression lambda.
Thorbjørn Ravn Andersen

Réponses:

125

Cela fait partie de la syntaxe des nouvelles expressions lambda, à introduire dans Java 8. Il y a quelques tutoriels en ligne pour comprendre, voici un lien vers un. Fondamentalement, le ->sépare les paramètres (côté gauche) de l'implémentation (côté droit).

La syntaxe générale d'utilisation des expressions lambda est

(Paramètres) -> {Body} où le '->' sépare les paramètres et le corps de l'expression lambda.

Les paramètres sont entre parenthèses, de la même manière que pour les méthodes et le corps de l'expression lambda est un bloc de code entre accolades.

Óscar López
la source
10
L'OP utilisant JDK 6, il ne s'agit donc en réalité que d'un code de pliage IntelliJ selon la réponse @antonm ci
Sean Landsman
6
@SeanLandsman OP utilise peut-être Java 6, mais dans la question, il déclare qu'il est tombé sur ce code ailleurs. Quant à savoir pourquoi IntelliJ ne signale pas une erreur, qui est un mystère (peut - être il est une version Java 7 installé quelque part dans le système OP). Mais c'est la syntaxe d'une expression lambda en Java, cela ne fait aucun doute.
Óscar López
37

Celui-ci est également utile lorsque vous souhaitez implémenter une interface fonctionnelle

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

est équivalent à

Runnable r = new Runnable() {
            @Override
            public void run() {
                System.out.print("Run method");
            }
        };
Justin Patel
la source
pourquoi cette fonctionnalité est-elle fournie?
Akaisteph7
1
@ Akaisteph7 lorsque vous ne voulez pas définir de méthode car vous constatez qu'un seul appelant appellera cette méthode. Dans ces cas, il est logique de NE PAS définir la méthode dans un endroit séparé plutôt que de passer dans le corps de la méthode, lisez à propos de la méthode anonyme suivie de lambda.
Vivek Shukla
30

Je crois que cette flèche existe à cause de votre IDE. IntelliJ IDEA fait une telle chose avec du code. C'est ce qu'on appelle le pliage de code. Vous pouvez cliquer sur la flèche pour l'agrandir.

Anton-M
la source
36
@DavidConrad Non, ce n'est pas faux. IntelliJ plie en effet les implémentations en ligne des interfaces fonctionnelles pour qu'elles ressemblent à des lambdas.
balpha
12
Regardez la question: "Détails: Java 6, Apache Commons Collection, IntelliJ 12" Lambda en java 6 ???
Anton-M
13

C'est une expression lambda.

Cela signifie que, à partir de la listOfCars, arg0 est l'un des éléments de cette liste. Avec cet élément, il va faire, d'où le ->, tout ce qui est à l'intérieur des crochets.

Dans cet exemple, il va renvoyer une liste de voitures qui correspondent à la condition

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