94

Durante la ricerca di un codice, mi sono imbattuto nell'operatore della freccia, che cosa fa esattamente? Pensavo che Java non avesse un operatore di freccia.Cosa fa l'operatore di frecce, '->', fa in Java?

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

dettagli: Java 6, Apache Commons Collection, IntelliJ 12

Aggiornamento/Risposta: Si scopre che IntelliJ 12 supporti Java 8, che supporta lambda, ed è " pieghevole "Predicati e mostrandoli come lambda. 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(); 
    } 
}); 
+3

Nota che lo scenario esatto è IntelliJ _rendering_ il codice esistente come un'espressione lambda per fare è più facile da leggere. Il codice attuale non è un'espressione lambda. –

risposta

74

che fa parte della sintassi delle nuove espressioni lambda, da introdurre in Java 8. Ci sono un paio di tutorial online per ottenere il blocco di esso, ecco una link a uno. Fondamentalmente, lo -> separa i parametri (lato sinistro) dall'espressione reale (lato destro).

+8

L'OP che utilizza JDK 6, quindi questo è in realtà solo il codice pieghevole IntelliJ come per @antonm risposta sotto –

+1

@SeanLandsman OP potrebbe utilizzare Java 6, ma nella domanda afferma che ha trovato quel codice altrove. Per quanto riguarda il motivo per cui IntelliJ non segnala un errore, questo è un mistero (forse c'è una versione di Java 7 installata da qualche parte nel sistema OP). Ma questa è la sintassi di un'espressione lambda in Java, non c'è dubbio. –

9

È un'espressione lambda.

Significa che, da listOfCars, arg0 è uno degli elementi di tale elenco. Con quell'elemento che sta per fare, da qui il ->, qualunque cosa ci sia dentro le parentesi.

In questo esempio, ha intenzione di restituire un elenco di vetture che si adattano la condizione

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

credo, questa freccia esiste a causa del vostro IDE. IntelliJ IDEA fa questa cosa con un po 'di codice. Questo è chiamato codice pieghevole. Puoi fare clic sulla freccia per espanderla.

+0

è più probabile. – irreputable

+9

Questo è sbagliato. È un'espressione lambda Java 8. –

+23

@DavidConrad No, non è sbagliato. IntelliJ, infatti, piega le implementazioni inline di interfacce funzionali per assomigliare a lambda. – balpha

8

Questo è utile anche quando si desidera implementare un'interfaccia

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

è equivalente a

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