Cosa fa l'operatore freccia '->' in Java?


171

Mentre cercavo un po 'di codice mi sono imbattuto nell'operatore freccia, che cosa fa esattamente? Pensavo che Java non avesse un operatore freccia.

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

Dettagli : Java 6, Collezione Apache Commons, IntelliJ 12

Aggiornamento / Risposta: Si scopre che IntelliJ 12 supporta Java 8, che supporta lambdas, e sta "piegando" i predicati e li visualizza come lambdas. Di seguito è riportato il codice "non piegato".

return (Collection<Car>) CollectionUtils.select(listOfCars, new Predicate() {
    public boolean evaluate(Object arg0) {
        return Car.SEDAN == ((Car)arg0).getStyle();
    }
});

5
Si noti che lo scenario esatto è IntelliJ che esegue il rendering del codice esistente come espressione lambda per facilitarne la lettura. Il codice effettivo non è un'espressione lambda.
Thorbjørn Ravn Andersen,

Risposte:


125

Fa parte della sintassi delle nuove espressioni lambda, che saranno introdotte in Java 8. Ci sono un paio di tutorial online per capire come funziona, ecco un link a uno. Fondamentalmente, ->separa i parametri (lato sinistro) dall'implementazione (lato destro).

La sintassi generale per l'uso delle espressioni lambda è

(Parametri) -> {Corpo} dove '->' separa i parametri e il corpo dell'espressione lambda.

I parametri sono racchiusi tra parentesi allo stesso modo dei metodi e il corpo dell'espressione lambda è un blocco di codice racchiuso tra parentesi graffe.


10
L'OP utilizza JDK 6, quindi questo è davvero solo il codice pieghevole IntelliJ secondo la risposta @antonm di seguito
Sean Landsman

6
@SeanLandsman OP potrebbe utilizzare Java 6, ma nella domanda afferma di aver trovato quel codice altrove. Quanto al motivo per IntelliJ non segnala un errore, che è un mistero (forse c'è una versione di Java 7 installato da qualche parte nel sistema di OP). Ma questa è la sintassi di un'espressione lambda in Java, non c'è dubbio.
Óscar López

37

Questo è utile anche quando si desidera implementare un'interfaccia funzionale

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

è equivalente a

Runnable r = new Runnable() {
            @Override
            public void run() {
                System.out.print("Run method");
            }
        };

perché viene fornita questa funzione?
Akaisteph7,

1
@ Akaisteph7 quando non si desidera definire un metodo perché si scopre che solo un chiamante potrà mai chiamare quel metodo. In quei casi ha senso NON definire il metodo in un posto separato piuttosto passare nel corpo del metodo, leggi il metodo anonimo seguito da lambda.
Vivek Shukla,

30

Credo che questa freccia esista a causa del tuo IDE. IntelliJ IDEA fa una cosa del genere con del codice. Questo si chiama ripiegamento del codice. È possibile fare clic sulla freccia per espanderlo.


36
@DavidConrad No, non è sbagliato. IntelliJ in effetti piega le implementazioni in linea delle interfacce funzionali per assomigliare a lambda.
balpha,

12
Guarda la domanda: "Dettagli: Java 6, Collezione Apache Commons, IntelliJ 12" Lambda in java 6 ???
Anton-M,

13

È un'espressione lambda.

Significa che, dall'elencoOfCars, arg0 è uno degli elementi di quell'elenco. Con quell'oggetto che farà, quindi il ->, qualunque cosa sia all'interno delle parentesi.

In questo esempio, restituirà un elenco di auto che soddisfano le condizioni

Car.SEDAN == ((Car)arg0).getStyle();

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.