Лямбда-выражения это безымянная функция с параметрами и телом.
Тело лямбда-выражение может быть оператором блока или выражение.
1 |
-> |
Отделяет параметры и тело.
1 |
(int х) -> х + 1 |
принимает параметр Int и возвращает значение параметра увеличивается на 1.
1 |
(int х, у int) -> х + у |
принимает два параметра целочисленные и возвращает сумму.
1 |
(String str) -> {System.out.println (str);} |
принимает параметр типа String и производит его вывод в консоль.
1 |
str-> System.out.println (str) |
принимает параметр и выводит его в консоль. Он аналогичен приведенному выше коду.
1 |
() -> "nookery.ru" |
не принимает никаких параметров и возвращает строку.
1 |
(String str) -> str.length () |
принимает параметр типа String и возвращает его длину.
Следующий лямбда принимает два параметра целочисленные и возвращает максимальное из двух.
1 2 3 4 |
(int x, int y) -> { int max = x > y ? x : y; return max; } |
Почему лямбда-выражения
Выражения лямбда позволяет нам передать логику в компактном виде.
Следующий код использует анонимный внутренний класс, чтобы добавить обработчик событий для действия нажатия кнопки.
1 2 3 4 5 |
button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.out.println("nookery.ru"); } }); |
Обработчик действия печатает сообщение в консоль, когда эта кнопка нажата.
С помощью лямбда-выражения мы можем добавить обработчик действий на события нажатия кнопки в одной строке кода.
1 |
button.addActionListener (е -> System.out.println ( "nookery.ru")); |
Java Лямбда Синтаксис
Общий синтаксис для использования лямбда-выражений
1 |
(Параметры) -> {тело} |
1 |
-> |
Отделяет параметры и лямбда — выражения тела.
Параметры заключены в круглые скобки, которые таким же образом, как для методов в то время как тело лямбда-выражение представляет собой блок кода, заключенный в фигурные скобки.
Выражение тела лямбда может иметь локальные переменные, операторы. Мы можем использовать перерыв, продолжить, и вернуться в лямбда-выражения тела. Мы можем даже выбросить исключения из выражения тела лямбда.
Лямбда-выражение не имеет имени, так как он представляет собой анонимный внутренний класс.
Тип возвращаемого значения лямбда-выражения выводится компилятором.
Лямбда-выражение не может иметь броски пункт как метод.
Лямбда-выражение не может быть общим, а родовое определяется в функциональном интерфейсе.
Явные и неявные лямбда-выражения
Лямбда-выражения, которое не декларирует тип, присвоенные его параметров, называется неявным лямбда-выражения.
Явное выражение лямбда лямбда-выражение, которое объявляет тип его параметров.
В примере ниже я написал, следующий код который создает интерфейс с одним методом и использует его в качестве типа лямбда — выражения. При создании лямбда — выражения мы объявляем тип параметра x1, чтобы иметь тип Integer.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class test { public static void main(String[] args) { MyCalc calc = (Integer x1) -> x1 * 2; System.out.println("Вычисляем 5*2= " + MyCalc.calc(5)); } } interface MyCalc{ public Integer calc(Integer x1); } |
Результатом выполнения программы будет: Вычисляем 5*2=10
Во втором примере я снова не использовал явно тип, но компилятор меня все равно понимает что я хочу.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class test { public static void main(String[] args) { MyCalc calc = (x1) -> x1 * 2; System.out.println("Вычисляем 5*2=" +MyCalc.calc(5)); } } interface MyCalc { public Integer calc(Integer x1); } |
Пропускаем указание типа параметров
Мы можем выбрать, чтобы исключить типы параметров в лямбда-выражений.
В лямбда — выражения
1 |
(int x, int y) -> { return x + y; } |
Типы параметров объявляются.
Мы можем смело переписать лямбда-выражения, опуская типы параметров, как в примере ниже.
1 |
(x, y) -> { return x + y; } |
Если мы решили опустить типы параметров, мы должны опустить типы для всех параметров.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class test { public static void main(String[] args) { Site stringSite = (str) -> str.length(); String name ="java-soft.ru"; int result = stringSite.getStr(name); System.out.println(result); } } @FunctionalInterface interface Site { int getStr(String str); } |
Результат выполнения программы будет: 12
Single Параметр
Для одного выражения параметра лямбда мы можем пропустить скобки, как мы пропускаем явно тип параметра.
Лямбда — выражения
1 |
(String msg) -> {System.out.println(msg);} |
Тогда мы можем опустить тип параметра, чтобы иметь
1 |
(str) -> {System.out.println (str);} |
Далее мы можем опустить тип параметра и круглые скобки следующим образом.
1 |
(str)->{System.out.println(str);} |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class test { public static void main(String[] args) { Site stringSite = str -> str.length(); String name ="java-soft.ru"; int result = stringSite.getStr(name); System.out.println(result); } } @FunctionalInterface interface Processor { int getStr(String str); } |
Результат будет тот же 12.
Нет Параметры
Для лямбда-выражения без параметров, мы по-прежнему можем нуждаются в том что бы ставить круглые скобки.
1 |
() -> { System.out.println("nookery.ru"); } |
В следующем примере показано , как использовать BooleanSupplier
.
1 2 3 4 5 6 7 8 9 10 11 12 |
import java.util.function.BooleanSupplier; public class test { public static void main(String[] args) { BooleanSupplier bool = () -> true; System.out.println(bool.getAsBoolean()); int x = 0, y= 1; bool = () -> x > y; System.out.println(bool.getAsBoolean()); } } |
Результатом выполнения программы будет: true; false;
Модификатор final
Вы можете использовать final модификатор в объявлении параметра явных лямбда — выражений.
Следующие выражения лямбда использовать конечный модификатор.
1 |
(final int x, final int y) -> { return x + y; } |
Мы можем использовать только один модификатор следующим образом.
1 |
(int x, final int y) -> {return x + y;} |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class test { public static void main(String[] args) { Site stringSite = (final String str) -> str.length(); String name = "nookery.ru"; int result = stringSite.getLen(name); System.out.println(result); } } @FunctionalInterface interface Site { int getLen(String str); } |
Результатом выполнения программы будет: 12;
Лямбда-выражения для тела
Телом лямбда-выражение может быть оператором блока или одно выражение.
Если оператор блока заключен в скобки, одновременно одно выражение может существовать без скобок.
В блоке возвращения мы можем использовать return оператор для возврата значения.
Следующее выражение лямбда использует оператор блока и использует return оператор , чтобы вернуть сумму.
1 |
int x, int y) -> { return x + y; } |
В то время как следующее лямбда использует выражение:
1 |
(int x, int y) -> x + y |
Выражение не требует фигурных скобок.
Лямбда не нужно возвращать значение. Следующие два лямбда-выражения просто выводят в консоль и ничего не возвращают.
1 2 |
(String str) -> {System.out.println (str);} // блок-заявление (String str) -> System.out.println (str) // выражение |
Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class test { public static void main(String[] argv) { Site stringSite = (String str) -> str.length(); String name = "nookery.ru"; int result = stringSite.getLen(name); System.out.println(result); } } @FunctionalInterface interface Site { int getLen(String str); } |
Результатом выполнения программы будет: 12