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


36
@DavidConrad Нет, это не так. IntelliJ действительно сворачивает встроенные реализации функциональных интерфейсов, чтобы выглядеть как лямбды.
Балфа

12
Посмотрите на вопрос: «Подробности: Java 6, коллекция Apache Commons, IntelliJ 12» Лямбда в Java 6 ???
Антон-М,

13

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

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

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

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

2

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

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.