94

Podczas polowania za pomocą jakiegoś kodu natknąłem się na operator strzałki, co dokładnie robi? Myślałem, że Java nie ma operatora strzałki.Co robi operator strzałki, "->", w Javie?

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

Szczegóły: Java 6, Apache Commons Collection, IntelliJ 12

Aktualizacja/Odpowiedź: Okazuje się, że IntelliJ 12 obsługuje Javy 8, który obsługuje lambdy, i jest " składanie "Wyznacza i wyświetla je jako lambdy. Poniżej znajduje się kod "niezłożony".

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

nocie, że dokładny scenariusz IntelliJ _rendering_ istniejącego kodu jako wyrażenie lambda do uczynienia łatwiej czytać. Rzeczywisty kod nie jest wyrażeniem lambda. –

Odpowiedz

74

To część składni nowych wyrażeń lambda, które mają być wprowadzone w Javie 8. Istnieje kilka tutoriali online, aby dostać się zawiesić go, oto link do jednego. Zasadniczo -> oddziela parametry (lewa strona) od rzeczywistego wyrażenia (prawa strona).

+8

OP używający JDK 6, więc jest to po prostu składany kod IntelliJ, jak na @antonm odpowiedź poniżej –

+1

@SeanLandsman OP może używać Java 6, ale w pytaniu stwierdza, że ​​natknął się na ten kod gdzie indziej. Co do tego, dlaczego IntelliJ nie zgłasza błędu, to jest tajemnicą (być może jest wersja Java 7 zainstalowana gdzieś w systemie OP). Ale to jest składnia wyrażenia lambda w Javie, nie ma co do tego wątpliwości. –

9

To wyrażenie lambda.

Oznacza to, że od listOfCars, arg0 jest jednym z elementów tej listy. Z tym przedmiotem ma zamiar zrobić, stąd ->, cokolwiek znajduje się w nawiasach.

W tym przykładzie, że zamierza powrócić listę samochodów, które pasują stan

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

wierzę, to strzałka istnieje dzięki swoim IDE. IntelliJ IDEA robi coś takiego z pewnym kodem. Nazywa się to składaniem kodu. Możesz kliknąć strzałkę, aby ją rozwinąć.

+0

to bardziej prawdopodobne. – irreputable

+9

To źle. Jest to wyrażenie lambda w języku Java 8. –

+23

@DavidConrad Nie, nie jest źle. IntelliJ faktycznie składa wbudowane implementacje funkcjonalnych interfejsów, które wyglądają jak lambdy. – balpha

8

Ten jest przydatny, jak również, gdy chcemy zaimplementować interfejs

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

jest równoważna

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