Блочные лямбда выражения в Java

Блочные лямбда выражения в Java

Тело лямбда-выражений обычно состоят из единственного выражения. Такая разновидность тел называется телом выражения, а лямбда-выра­жения с телом выражения иногда еще называют одиночными.

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

Несмотря на все удобство одиночных лямбда-выражений, иногда в них требуется вычислять не одно выражение.

Для подобных случаев в Java пред­усмотрена вторая разновидность лямбда-выражений, где код, указываемый в пра­вой части лямбда-оператора, может состоять из нескольких операторов. Такие лямбда-выражения называются блочными, а их тело телом блока.

Блочное лямбда-выражение расширяет те виды операций, которые могут вы­полняться в лямбда-выражении, поскольку оно допускает в своем теле наличие не­скольких операторов.

Например, в блочном лямбда-выражении можно объявлять переменные, организовывать циклы, указывать операторы выбора if и switch, создавать вложенные блоки и т.д.

Создать блочное лямбда-выражение совсем не трудно. Для этого достаточно заключить тело выражения в фигурные скобки та­ким же образом, как и любой другой блок кода.

Кроме наличия в теле выражения нескольких операторов, блочные лямбда­ выражения применяются точно так же, как и одиночные лямбда-выражения.

Однако для возврата значения из блочных лямбда-выражений нужно явно указывать оператор return. Это нужно делать потому, что тело блочного лямбда-выражения не представляет одиночное выражение.

Ниже приведен пример программы, в котором блочное лямбда-выражение применяется для вычисления и возврата факториала целочисленного значения.

//  -, 
//   

interface NumericFunc {
    int func(int n);
}

class BlockLambdaDemo {

    public static void main(String args[]) {

    //   - 
    //   
    NumericFunc factorial = (n) -> {
        int result = 1;

        for(int i = 1; i <=n; i++) {
        result = i * result;
        }

        return result;
    };

    System.out.println("  6  " + factorial.func(6));
    System.out.println("  8  " + factorial.func(8));
    System.out.println("  10  " + factorial.func(10));
    }
}

Ниже приведен результат выполнения данной программы:

pro-java.ru@admin:~$ javac lambd.java
pro-java.ru@admin:~$ java BlockLambdaDemo
  6  720
  8  40320
  10  3628800
pro-java.ru@admin:~$

В данном примере программы обратите внимание на то, что в блочном лямбда ­выражении объявляется переменная result, организуется цикл for и указывает­ся оператор return.

Все эти действия вполне допустимы в теле блочного лямбда­ выражения. По существу, тело блока такого выражения аналогично телу метода.

Следует также иметь в виду, что когда в лямбда-выражении оказывается оператор return, он просто вызывает возврат из самого лямбда-выражения , но не из объ­емлющего его метода.

Ниже приведен еще один пример блочного лямбда-выражения. В данном при­мере программы изменяется на обратный порядок следования символов в строке.

//  ,   
//     

interface StringFunc {
    String func(String n);
}

class BlockLambdaDemoString {

    public static void main(String args[]) {

    //      
    //     

    StringFunc reverse = (str) -> {
        String result = "";
        int i;

        for(i = str.length() - 1; i >=0; i--) {
        result += str.charAt(i);
        }
           
        return result;
    };

    System.out.println("   " + reverse.func(""));
    System.out.println("   " + reverse.func(""));
    }
}

Ниже приведен результат выполнения данной программы.

pro-java.ru@admin:~$ javac lambdstr.java
pro-java.ru@admin:~$ java BlockLambdaDemoString 
   
   
pro-java.ru@admin:~$

В данном примере программы в функциональном интерфейсе StringFunc объ­является метод func() принимающий параметр типа String и возвращающий значение типа String.

Следовательно, в лямбда-выражении reverse тип параме­тра str должен быть выведен как String. Обратите внимание на то, что метод charAt() вызывается для параметра str как для объекта.

И это вполне допустимо, поскольку этот параметр имеет тип String благодаря выведению типов.

Cоветуем вам следующее видео к просмотру

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *