Что делает оператор стрелки '->' в Java?

171

При поиске кода я наткнулся на оператор стрелки, что именно он делает? Я думал, что у 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, отображающий существующий код в виде лямбда-выражения, чтобы его было легче читать. Фактический код не является лямбда-выражением.
Турбьёрн Равн Андерсен

Ответы:

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 делает такую ​​вещь с некоторым кодом. Это называется свертыванием кода. Вы можете нажать на стрелку, чтобы развернуть ее.

Anton-M
источник
36
@DavidConrad Нет, это не так. IntelliJ действительно сворачивает встроенные реализации функциональных интерфейсов, чтобы выглядеть как лямбды.
Балфа
12
Посмотрите на вопрос: «Подробности: Java 6, коллекция Apache Commons, IntelliJ 12» Лямбда в Java 6 ???
Антон-М,
13

Это лямбда-выражение.

Это означает, что из listOfCars arg0 является одним из элементов этого списка. С этим элементом он собирается делать, следовательно - -> все, что находится внутри скобок.

В этом примере он собирается вернуть список автомобилей, которые соответствуют условиям

Car.SEDAN == ((Car)arg0).getStyle();
простой томас
источник
2

Новый оператор для лямбда-выражения добавлен в Java 8

Лямбда-выражение - это короткий способ написания метода.
Это косвенно используется для реализации функционального интерфейса

Основной синтаксис: (параметры) -> {операторы; }

Есть несколько основных правил для эффективного написания лямбда-выражений, которые вы должны знать.

Manasi
источник