Синтаксис Java: “->”

361
10 ноября 2017, 07:38

Что обозначает это выражение?

private static final Predicate<Object> removeDotPred = symbol -> !MULTI_ARGS_SIGNAL.equals(symbol);

В частности, интересно, что значит знак "->".

Answer 1

В Java 8 появились лямбда выражения.

Lambda-выражения – это что-то вроде анонимных функций. Если попроще — это метод без объявления, т.е. без модификаторов доступа, возвращающие значение и имя. Они позволяют написать метод и сразу же использовать его.

Lambda-выражения в Java обычно имеют следующий синтаксис (аргументы) -> {тело}. Например:

(арг1, арг2...) -> { тело }
(тип1 арг1, тип2 арг2...) -> { тело }

Далее идет несколько примеров настоящих Lambda-выражений:

(int a, int b) -> {  return a + b; }
() -> System.out.println("Hello World");
(String s) -> { System.out.println(s); }
() -> 42
() -> { return 3.1415 };

Структура lambda-выражений может быть разной:

  • Lambda-выражения могут иметь от 0 и более входных параметров.
  • Тип параметров можно указывать явно либо может быть получен из контекста. Например (int a) можно записать и так (a)
  • Параметры заключаются в круглые скобки и разделяются запятыми.

    Пример: (a, b) или (int a, int b) или (String a, int b, float c)

  • Если параметров нет, то нужно использовать пустые круглые скобки.

    Пример: () -> 42

  • Когда параметр один, если тип не указывается явно, скобки можно опустить.

    Пример: a -> return a*a

  • Тело Lambda-выражения может содержать от 0 и более выражений.
  • Если тело состоит из одного оператора, его можно не заключать в фигурные скобки, а возвращаемое значение можно указывать без ключевого слова return.
  • В противном случае фигурные скобки обязательны (блок кода), а в конце надо указывать возвращаемое значение с использованием ключевого слова return (в противном случае типом возвращаемого значения будет void).

В Вашем случае symbol -> !MULTI_ARGS_SIGNAL.equals(symbol); - это один входной параметр symbol, а тело состоит из одного оператора, а значит можно не указывать ключевое слово return, но оно подразумевается.... по старому это будет как-то так:

public boolean Test(symbol) {
    returm !MULTI_ARGS_SIGNAL.equals(symbol);
}
READ ALSO
Клонирование Object&#39;ов с модификатором final

Клонирование Object'ов с модификатором final

Будет ли final клон другого final объектаКлонирование реализовано с помощю интерфейса Clonable

287
Как записать данные в файл с консоли

Как записать данные в файл с консоли

Мне надо создать метод, который будет записывать все содержимое введенное пользователем с консоли в файл по заданному пути, не перезаписывая...

321
Почему объект String не передаётся по ссылке

Почему объект String не передаётся по ссылке

Доброго времени сутокВ консоль данный код выводит: "slipstream slip stream", а не "slipstream slipstream stream" как я предполагал

294