Co robi operator strzałki „->” w Javie?

170

Przeszukując jakiś kod natknąłem się na operatora strzałki, co on właściwie robi? Myślałem, że Java nie ma operatora strzałki.

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 Javę 8, która obsługuje lambdy i „składa” predykaty 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();
    }
});
Mike Rylander
źródło
5
Zwróć uwagę, że dokładnym scenariuszem jest IntelliJ renderujący istniejący kod jako wyrażenie lambda, aby ułatwić czytanie. Rzeczywisty kod nie jest wyrażeniem lambda.
Thorbjørn Ravn Andersen

Odpowiedzi:

125

To część składni nowych wyrażeń lambda, które mają zostać wprowadzone w Javie 8. Istnieje kilka samouczków online, które pomogą Ci to zrozumieć. Oto link do jednego z nich. Zasadniczo ->oddziela parametry (lewa strona) od implementacji (prawa strona).

Ogólna składnia używania wyrażeń lambda to

(Parametry) -> {Body}, gdzie „->” oddziela parametry i treść wyrażenia lambda.

Parametry są ujęte w nawiasy, tak samo jak w przypadku metod, a treść wyrażenia lambda to blok kodu ujęty w nawiasy.

Óscar López
źródło
10
OP używający JDK 6, więc tak naprawdę jest to tylko składany kod IntelliJ, zgodnie z odpowiedzią @antonm poniżej
Sean Landsman
6
@SeanLandsman OP może używać Java 6, ale w pytaniu stwierdza, że ​​natknął się na ten kod w innym miejscu. Dlaczego IntelliJ nie zgłasza błąd, to jest tajemnica (być może tam jest Java 7 wersja zainstalowany gdzieś w systemie OP). Ale to jest składnia wyrażenia lambda w Javie, nie ma co do tego wątpliwości.
Óscar López
37

Ten jest również przydatny, gdy chcesz zaimplementować funkcjonalny interfejs

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

jest równa

Runnable r = new Runnable() {
            @Override
            public void run() {
                System.out.print("Run method");
            }
        };
Justin Patel
źródło
dlaczego jest dostępna ta funkcja?
Akaisteph7
1
@ Akaisteph7, gdy nie chcesz definiować metody, ponieważ okazuje się, że tylko jeden wywołujący kiedykolwiek wywoła tę metodę. W takich przypadkach sensowne jest NIE definiowanie metody w osobnym miejscu, a raczej przekazywanie jej w treści, poczytaj o metodzie anonimowej, po której następuje lambda.
Vivek Shukla
30

Wierzę, że ta strzała istnieje dzięki twojemu IDE. IntelliJ IDEA robi coś takiego z jakimś kodem. Nazywa się to zwijaniem kodu. Możesz kliknąć strzałkę, aby ją rozwinąć.

Anton-M
źródło
36
@DavidConrad Nie, to nie jest złe. IntelliJ rzeczywiście zwija implementacje wbudowane funkcjonalnych interfejsów, aby wyglądały jak lambdy.
balpha
12
Spójrz na pytanie: „Szczegóły: Java 6, Apache Commons Collection, IntelliJ 12” Lambda in java 6 ???
Anton-M
13

To wyrażenie lambda.

Oznacza to, że z listy listOfCars arg0 jest jedną z pozycji tej listy. Z tym elementem ma zamiar zrobić, stąd ->, cokolwiek jest w nawiasach.

W tym przykładzie zwróci listę samochodów spełniających ten warunek

Car.SEDAN == ((Car)arg0).getStyle();
proste-thomas
źródło