Was macht der Pfeiloperator '->' in Java?

170

Was genau macht ich beim Durchsuchen eines Codes, der auf den Pfeiloperator gestoßen ist? Ich dachte, Java hätte keinen Pfeiloperator.

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

Details : Java 6, Apache Commons Collection, IntelliJ 12

Update / Antwort: Es stellt sich heraus, dass IntelliJ 12 Java 8 unterstützt, das Lambdas unterstützt, Prädikate "faltet" und sie als Lambdas anzeigt. Unten ist der "ungefaltete" Code.

return (Collection<Car>) CollectionUtils.select(listOfCars, new Predicate() {
    public boolean evaluate(Object arg0) {
        return Car.SEDAN == ((Car)arg0).getStyle();
    }
});
Mike Rylander
quelle
5
Beachten Sie, dass das genaue Szenario IntelliJ Rendering den vorhandenen Code als Lambda - Ausdruck , um es einfacher zu lesen. Der eigentliche Code ist kein Lambda-Ausdruck.
Thorbjørn Ravn Andersen

Antworten:

124

Dies ist Teil der Syntax der neuen Lambda-Ausdrücke, die in Java 8 eingeführt werden sollen. Es gibt einige Online-Tutorials, um den Überblick zu behalten. Hier ist ein Link zu einem. Grundsätzlich ->trennt das die Parameter (links) von der Implementierung (rechts).

Die allgemeine Syntax für die Verwendung von Lambda-Ausdrücken lautet

(Parameter) -> {Body} wobei das '->' Parameter und Lambda-Ausdruckskörper trennt.

Die Parameter sind wie bei Methoden in Klammern eingeschlossen, und der Lambda-Ausdruckskörper ist ein Codeblock in geschweiften Klammern.

Óscar López
quelle
10
Das OP mit JDK 6, das ist also wirklich nur IntelliJ-Faltcode gemäß @antonm Antwort unten
Sean Landsman
6
@ SeanLandsman OP verwendet möglicherweise Java 6, aber in der Frage gibt er an, dass er diesen Code an anderer Stelle gefunden hat. Warum IntelliJ keinen Fehler meldet, ist ein Rätsel (möglicherweise ist irgendwo im OP-System eine Java 7-Version installiert). Aber das ist die Syntax eines Lambda-Ausdrucks in Java, keine Frage.
Óscar López
37

Dieser ist auch nützlich, wenn Sie eine funktionale Schnittstelle implementieren möchten

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

ist äquivalent zu

Runnable r = new Runnable() {
            @Override
            public void run() {
                System.out.print("Run method");
            }
        };
Justin Patel
quelle
Warum wird diese Funktion bereitgestellt?
Akaisteph7
1
@ Akaisteph7, wenn Sie keine Methode definieren möchten, weil Sie feststellen, dass nur ein Aufrufer diese Methode jemals aufrufen wird. In diesen Fällen ist es sinnvoll, die Methode NICHT an einer separaten Stelle zu definieren, sondern im Hauptteil der Methode zu übergeben und über die anonyme Methode gefolgt von Lambda zu lesen.
Vivek Shukla
30

Ich glaube, dieser Pfeil existiert aufgrund Ihrer IDE. IntelliJ IDEA macht so etwas mit etwas Code. Dies wird als Code-Faltung bezeichnet. Sie können auf den Pfeil klicken, um ihn zu erweitern.

Anton-M
quelle
36
@ DavidConrad Nein, das ist nicht falsch. IntelliJ faltet tatsächlich Inline-Implementierungen von Funktionsschnittstellen so zusammen, dass sie wie Lambdas aussehen.
Balpha
12
Schauen Sie sich die Frage an: "Details: Java 6, Apache Commons Collection, IntelliJ 12" Lambda in Java 6 ???
Anton-M
13

Es ist ein Lambda-Ausdruck.

Dies bedeutet, dass arg0 aus listOfCars eines der Elemente dieser Liste ist. Mit diesem Gegenstand wird er etwas tun, daher das ->, was auch immer sich in den Klammern befindet.

In diesem Beispiel gibt er eine Liste der Autos zurück, die dem Zustand entsprechen

Car.SEDAN == ((Car)arg0).getStyle();
einfache thomas
quelle