Що робить оператор зі стрілками '->' у Java?


170

Під час полювання через якийсь код я натрапив на оператора стрілки, що саме це робить? Я думав, що у Java немає оператора зі стрілками.

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

Детальніше : Java 6, колекція Apache Commons, IntelliJ 12

Оновлення / відповідь: Виявляється, IntelliJ 12 підтримує Java 8, яка підтримує лямбда, і "складає" предикати і відображає їх як лямбда. Нижче наведено код "без складання".

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

5
Зауважте, що точний сценарій полягає в тому, що IntelliJ надає існуючий код як лямбда-вираз, щоб полегшити його читання. Фактичний код - це не лямбда-вираз.
Thorbjørn Ravn Andersen

Відповіді:


125

Це частина синтаксису нових лямбдаських виразів, які слід ввести на Java 8. Існує кілька онлайн-підручників, щоб ознайомитись з ним, ось посилання на одне. В основному, ->розділяє параметри (лівий бік) від реалізації (правий бік).

Загальний синтаксис використання лямбда-виразів є

(Параметри) -> {Body}, де '->' розділяє параметри і тіло вираження лямбда.

Параметри укладені в дужки, що аналогічно методам, а тіло вираження лямбда - це блок коду, укладений у дужки.


10
ОП використовує JDK 6, тож це справді лише складний код IntelliJ відповідно до відповіді @antonm нижче
Шон Ландсман

6
@SeanLandsman OP, можливо, використовує Java 6, але в питанні він говорить, що він натрапив на цей код в іншому місці. Щодо того, чому IntelliJ не повідомляє про помилку, це таємниця (можливо, є версія Java 7, встановлена ​​десь в системі ОП). Але це синтаксис лямбда-виразу в Java, про це не йдеться.
Оскар Лопес

37

Цей варіант також корисний, коли ви хочете реалізувати функціональний інтерфейс

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

еквівалентно

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

чому ця функція надається?
Akaisteph7

1
@ Akaisteph7, коли ви не хочете визначати метод, оскільки ви виявите, що тільки один абонент коли-небудь збирається зателефонувати цьому методу. У цих випадках має сенс НЕ визначати метод в окремому місці, а передавати в тілі методу, читати про анонімний метод з подальшим лямбда.
Вівек Шукла

30

Я вважаю, ця стрілка існує через ваш IDE. IntelliJ IDEA робить таке з деяким кодом. Це називається складанням коду. Ви можете натиснути на стрілку, щоб розгорнути її.


36
@DavidConrad Ні, це не помиляється. IntelliJ дійсно складає вбудовані втілення функціональних інтерфейсів, щоб мати вигляд лямбда.
balpha

12
Подивіться на питання: "Детальніше: Java 6, колекція Apache Commons, IntelliJ 12" Lambda in java 6 ???
Антон-М

13

Це лямбда-вираз.

Це означає, що зі спискуOfCars, arg0 є одним із елементів цього списку. З цим пунктом він збирається робити, отже, ->, що знаходиться всередині дужок.

У цьому прикладі він збирається повернути список машин, які відповідають умовам

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

2

У java 8 доданий новий оператор для лямбда-експресії

Лямбда-експресія - це короткий спосіб написання методу.
Він опосередковано використовується для реалізації функціонального інтерфейсу

Первинний синтаксис: (параметри) -> {заяви; }

Існують деякі основні правила ефективного написання лямбда-виразів, які слід знати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.